FWIW this is what I do.
I do it for the reasons you stated - to have time to load the main application and do any initialising I need before showing the UI.
This is the general approach for most applications.
As I do a lot of smaller applications so I decided to write some reuse code and have a generic splash screen engine.
When requirements dictate, I just start with an engine template and go from there.
This is my project, it has two important VIs
Launcher - which is not statically coupled to the application hierarchy
VI Tree - contains all other Top Level VIs (not Launcher)
This makes the Build Spec very simple and does not need to be changed.
I then create a Splash Screen for each application that can look like whatever (note: toolbar only shown in dev environment)
The BD code looks like this - this is the reuse code. I just configure it with the Main VI and UI VI.
The Engine does its stuff. Launches the Main VI in the background
Does some fading out or other screen effects based on a Timer
Then due to the RTE exiting if a FP is not in memory, the application does a check and waits for the UI's FP to be loaded. This means I have time to initialize the UI etc... before showing it.
Pretty basic I know, but it works.
I have other apps where the Splash Screen can create a log of the session, checks for driver version (DAQmx, dotNET) etc...
I would like to add more features into the reusable code that I have in these other applications when I have the time.