This essentially is a UV issue. As characters are added to the dynamically generated texture, Unity will occasionally need to rebuild the entire texture to make room for more characters. It may make the texture bigger, or it may remove unused characters, but in either case the UVs of each individual character are changing.
Unity provides an API to notify applications when this rebuild is happening, and NGUI listens to those events and flags affected labels to be rebuilt the next time UIPanel's LateUpdate is run. However, if you manage to instantiate some UILabels or otherwise cause new characters to be rendered for a dynamic font after UIPanel.LateUpdate, but before the end of the frame, then NGUI doesn't have a chance to respond until the next frame. We've run into this problem once or twice. It becomes especially apparent when doing blocking operations that cause a long delay between frames. You don't notice this in the editor because (I think) the editor keeps the dynamic texture around between invocations of your code, so it's likely already sized large enough that a rebuild isn't necessary.
In our case, we were instantiating some UI prefabs while handling a network response from a coroutine. Somehow the Start function was being called on those instances after UIPanel.LateUpdate but still in the same frame. We managed to work around it by having the coroutine set a flag that we waited until the next Update to act on, so our prefabs were instantiated at a different time. Michael might be able to address this in NGUI somehow, but it's probably not trivial to rebuild all of the affected panels outside of LateUpdate.