That's a great question. All things considered, I think that allowing multiple GApp instances results in simpler client-level code and simpler library-level code.
For example, the current constructor of GApp takes a single OSWindow as input. Suppose instead you wanted to pass in multiple OSWindows, or multiple RenderDevices. You could certainly do this, but you would need to reimplement a lot of the functionality in the GApp base class. You'd need to create multiple instances of WidgetManager, UserInput, and FirstPersonManipulator somewhere. Each of these classes take an OSWindow as input during initialization. Of course, this is easily accomplished, but it means changing GApp::m_widgetManager to be a list of WidgetManagers, GApp::m_debugController to be a list of FirstPersonManipulators, etc. Quite an intrusive change in GApp.
Alternatively, you could make these changes in a derived class (e.g., GMultipleWindowApp derived from GApp). But since GApp::m_widgetManager is protected, any derived classes would have access to m_WidgetManager (which would be NULL all the time because you're not using it any more) and the new GMultipleWindowApp::m_widgetManagers list. This might lead to confusion in client code. You'd also need to reimplement any code from GApp that refers to GApp::m_WidgetManager with new code that handles this new list of WidgetManagers. Repeat for UserInput and FirstPersonManipulator.
In addition, you'd need to reimplement GApp::show(...), GApp::onRun(...), GApp::oneFrame(...), GApp::endRun(...), and GApp::processEventQueue(...). These methods assume there is a single OSWindow associated with the GApp. You'd need to change all of this code to handle multiple OSWindows.
But suppose you did all that. Now you have a GMultipleWindowApp class that is working correctly and is fully debugged. What do you do in your MyMultipleWindowApp::onGraphics3D method? You'd probably like some way of encapsulating all the client-specific rendering functionality associated with a single window. That way, you could call the doRendering(...) method for each window in a loop inside your MyMultipleWindowApp::onGraphics3D method. Suppose you'd like to do the same thing for user input, so you can call the doUserInput(...) method for each window in a loop inside your MyMultipleWindowApp::onUserInput method. At this point, the interface for the single-window functionality starts to look a lot like the original GApp interface.
In fact, you there is a strong argument in favor of putting the code for individual windows in classes derived from GApp. This design allows you to easily create a stand-alone app that runs a single one of your windows. For example, you could imagine some kind of game level designer tool with a bunch of different windows. The shipping game would just be the main window from the level designer tool running in full-screen with a few extra systems turned on. In support of this modular design, it makes sense to have the code for each window live in a class derived from GApp. But now you're back to the original problem of debug rendering in multiple concurrent GApps :)
So, with all of these design considerations in mind, I think supporting multiple GApps is the correct approach.