Here's a possible solution:
You could, in your App Start, kick off a worker thread that actually goes off and loads the data and processes everything that you need to do. You'd set an Application() variable to say that the thread is running and that it hasn't completed yet.
Then, whenever you get a request, check that Application() variable and display your "waiting" page (probably something that redirects itself periodically).
Finally, when the worker thread finishes, it can set the Application() variable to indicate that the thread is complete.
Something (very roughly) like this> In AppStart:
Application("StartupProcessingComplete") = False
t = New Threading.Thread(AddressOf WorkerFunction)
t.Start()
In the WorkerFunction:
<Do the work>
Application("StartupProcessingComplete") = True
In your Page Init, check the variable
If Not Application("StartupProcessingComplete") Then
<Redirect to "Wait" page>
Endif