Great question. The closest answer I found was in this infographic which states that the maximum users are willing to wait is 5 seconds after which they will exit the app.

A snippet from the screenshot which pertains to loads times for apps
Also do note that the different app stores do enforce an limit on the load time for an app. To quote this article
All mobile operating systems – iOS, Android, and even Windows –
enforce a maximum app startup time. For iOS, the limit is about 15
seconds, and if your app isn’t running by then the operating system
will kill it.
With regards how to optimize your performance and how to keep the user engaged, I strongly recommend reading this excellent article from smashing magazine which has this to say:
Speed up perceived performance
The designer cannot control performance all of the time. The network
might be slow; the device might be running other tasks in the
background; certain operations might require a lot of calculation. If
the user at least perceives that they are not losing time, then the
app will make a solid impression. Design can help communicate this,
even during unexpected delays.
The first step is to identify flows that will likely have delays
(fetching back-end data, performing a lot of calculations, etc.). The
second step is to guide users through these delays by introducing
additional steps that they would perceive as being necessary (showing
loading animations, displaying useful tips, etc.).
The following set of images shows possible steps in a content search:

The user here experiences four steps:
- Hits the search button.
- Sees a loading animation.
- Sees the first part of the list, with textual content and placeholder images (which could be stored in the app itself).
- Sees the actual thumbnail images appear.
The user experiences short steps, rather than jumping directly from
step one to four, and so perceives progress rather than delay.
Another example which is recommended is doing partial loads as shown below:
Another example is when an app starts loading up. By first displaying
a picture that matches the application’s layout, the user gets the
impression that the app is loading more quickly. The screenshot below
illustrates this; however, the perceived performance could be sped up
even more by adding a simple progress notification in the blank space
of the first screen. This would avoid the impression that something is
waiting to be loaded. (In case of a slow connection the app does show
a loading notification, thereby communicating progress to the user for
that situation).

The article also has two other recommendations namely smart loading and background loading which can help create an illusion of faster loading
Smart loading
Smart-loading mechanisms, such as lazy loading, first load visible
content and then move on to content below the fold. This technique
reduces the user’s waiting time and thus makes for a smoother
experience.
Background loading
This is another well-known example. Performance depends on whether the
background is one large image, an amalgamation of small tiles (say, to
create a texture) or a pure algorithm. The best solution depends on
the situation.
I also recommend reading this research paper Fast App Launching for Mobile Devices Using Predictive
User Context which talks about using cache and proactive content updates to quickly load apps