You are running into multiple problems that are contributing to the lag:
AoE spells (like fireball): By default, these spells calculate damage once per creature (and sometimes door and placeable) in the area of effect, then recalculate damage based on saving throws for each creature, then create and apply the damage effect to each target. Hurling multiples of these types of spells per round means more such calculations. Editing the spell scripts to do a single initial damage calculation (then reuse it in the "while" loop) can cut down on, but not eliminate, the processing required of the server.
NPC scripts: Every NPC is running multiple scripts in combat (onperception, onheartbeat, onspellcastat, ondamaged, ondeath, onspawn, etc.). Rescripting some of these to streamline the code, simplify functions, and remove redundant function calls may lead to minor speed improvements.
Multiple PCs in same area: This is a big one. Think of it this way...
A single PC is fighting an NPC in an area on your server. The server must process all of the scripting and actions of the NPC (running scripts, calculating attacks/saves/etc., working with effects, and more), and must take into account commands and status (hitpoints, effects, items, feats, spells, etc.) of the PC, all the while sending data to the player's computer and getting information from the player's computer and recalculating everything sometimes multiple times per round (think of a character with multiple attacks/round).
You know the combat log and how cluttered that can look? There's more information being passed to your computer than just that text.
Now in comes a second PC to the same area to help (no other additional NPCs yet). Now the server has to increase the amount of data moved and processed. It has to still do all the NPC data crunching, and still do everything for the first PC, but now much of it has to be done again for the second PC (sending data back and forth, processing position/status of the 2nd PC), and processing any possible interconnection actions of both PCs.
Say it's a tough NPC the first two are fighting, and a third PC joins the fray. Now the server has to increase its processing again. Yes, the server's workload is multiplying with each additional PC in the same area (a single PC in an area is much less work for the server).
Now the NPC called in some buddies (or more are spawned). Oh, look, even more interactions for the server to process. Then the PCs start summoning balors and familiars and such. Even more objects to track and process and to communicate with outside computers about.
Wait, these are high level NPCs and PCs? So now the server is dealing with multiple attacks/round from multiple PCs and NPCs, changing the statuses of multiple creature objects multiple times per round (let's not get into my monk/ranger that dual wields dev. critting (fort. save calculations) vampiric regen (hitpoint changes on wielder) kamas with multiple elemental damage types (multiple resistances to get checked with each attack and damage being applied) and gets 9-10 attacks per round when hasted and using flurry of blows), all the while sending this information to and from multiple computers over the internet (and NWN can be played by folks on dial-up connections!)