We have a scrollable map that contains all of the game's levels (55 in total), including level number, icon, player's best time, two par times, and various sprites showing whether or not level-specific goals were reached. Due to an uncommon control method, it's not possible to show this information piecemeal. The total number of NGUI widgets is very high, but as I mentioned, there are no issues at runtime. The map is larger than the screen, so not all of the widgets are always visible (but they still need to wake up to begin with). The 1-2 seconds I mentioned is the sum of time spent on OnEnable(), Awake() and Start() calls on NGUI widgets, mostly sprites and labels.
We already have a load screen. This is not an issue of maximum load time, it's about the frame rate freezing for the time it takes to call Awake() and Start() on a large number of GameObjects that are mostly NGUI widgets, because this isn't asynchronous. The loading screen animation does not advance during this time.
I managed to split the loading somewhat by making each submenu into a prefab, then having a coroutine instantiate them, one per frame. This alleviates the problem a bit, but the map is by far the biggest of the submenus - the others take only a few milliseconds to initialize. It looks like I'll need to somehow split the map into segments as well.