I discovered how it's happening, but not why. It does not make any damn sense to me.
Basically here's how it's happening, even though the OnSystemTick() is locking the MobilesTable... whenever an EventSink is called, and even though they are designed the same way to LOCK the MobilesTable prior to modification (which if it is currently locked it makes that thread wait until it's available again), it IGNORES the lock and proceeds to modify anyways.
I don't know why it would ignore the lock. However, I have tested this and I had the OnDisconnected EventSink start a timer, in which when the timer ticks, it will lock the MobilesTable and perform the same function that the EventSink was doing. To my disbelief, it freakin' worked that way.
I didn't want to use a timer (even though it would be set to TimeSpan.Zero and execute immediately) to perform this function, I changed the EventSinks to use a queue for logins and a queue for logouts. I created another timer that checks these queues once every 5 seconds and if there's anything in either queue, lock the MobilesTable and process it accordingly.
I also decided to not enumerate through the MobilesTable in the OnSystemTick() method and chose to enumerate through NetState.Instances (like I did in v2.0.0). I still want the queues used for the EventSinks, because there is still potetial for disaster without them being used.
After I finish some code cleanup (optimizations, consolidations, etc...) in Custom.cs (damn file was 158kb), I will be releasing v2.0.4, which contains 12 bug fixes (I found a lot of bugs!).
I was going to wait before releasing the next version so I could create the gumps for the system and gumps for the EvilSpawners, but there are too many bug fixes, some crash bugs.