I really like that they figured out a way in LV 2009 to fix the naming conflict problem in a built application. But an unfortunate side effect is that if you want to run a VI within an executable, you must know the full embedded path. Depending on how your sub-VIs are organized, this path can be unpredictable. You can go back to the LV 8.x file layout, but then you are back to the original problem. I figured out a way to have the best of both worlds--it is possible to force a sub-VI to be saved into the "root" of the application in LV 2009.
First off, you need to create a new destination in your build that is the path of the built application.
Then you need to explicitly add the sub-VI to the project, and set its destination to be the new destination you just created.
Now when you build the application, no matter where the sub-VI is located relative to the top-level VI, its path will always be at the "root".
This was really useful when I was building an app as an ActiveX server, and I wanted to call a VI within the app remotely using the VI server.