Well, there really is no other method for launching a subVI dynamically and have it run autonomously while your main VI continues to run and respond to events. Thus, the question of efficiency is pretty much moot in this case. It's not that much different from spawning a thread to execute a function in C-based program so that you can continue to the next step while that function chugs away.
You didn't provide a full picture of how your code is structured or what you do in your main VI, but it sounds like you've got a main VI with an event structure you use to respond to events. Presumably you have a button that when clicked launches one of these VIs and then you return to your event loop, as long as the "wait until done" is false. If you have a constant wired to the event structure's "Timeout" input then you will then execute the "Timeout" case if no other events are pending since that's how you've configured the event structure. Otherwise, it will just site there waiting for another event.