There is no neat solution unfortunately. If events were queued up, then that would break other contracts. For example, on_modified is currently always called before run_command returns, and queueing up the event would break this.
The reality is that Sublime Text relies on plugins being good citizens in any case (e.g., not doing blocking io in the main thread, not doing a lot of computation in the main thread), and not doing things like changing input focus in response to plugin_loaded in part of that: I can't imagine how that would ever be a good user experience, for example.
I'm not quite sure why jburnett would have been seeing on_activated getting called before plugin_loaded sometimes, while a plugin switching input focus in response to plugin_loaded() would cause this, I'd be surprised if such a plugin even exists at this point in time.