If there is an executor, -invalidate enqueues a block of work to do on the JS queue. Included in this is the mainThreadInvalidate with a comment which states it's intended for the main thread.
This will manifest in a crash if the invalidation occurs at exactly the same time as -registerModules is running through the modules by name and hooking up the bridge on those. In our case, RCTUIManager is calling -modules on the bridge. After this invalidation has run on the other thread, _modulesByName has gone to nil and causes the assert in -[RCTBatchedBridge modules] to fire.
Looking at master, this has been fixed. I just wanted this captured, so others seeing issues on previous builds can know. In our case, we're based on v0.4.4, but v0.5.0 and v0.6.0-rc have it.