Why not using threading to read data like sockets or for other
things that usage loops?
Because mIRC is a single threaded application. You can't just drop in multithreading for sockets. It would require enough work that you might as well do the entire thing at the same time, which may be done in the future at some point, but wouldn't happen anytime soon.
Event loops are better, since you can emulate threading without the added programming complexity. If your data processing gets too heavy, you can always move it into /timers to lessen the load-- which would be similar to spawning threads.