For the lists of active and inactive objects, I would use a dead/live list. This is actually two doubly linked lists where one contains all the dead items and one contains all the live items. At server initialization, create 1000 items and add them all to the dead list. Better still, instead of making 1000 separate memory allocations, just allocate one block of memory big enough for 1000 items and them use that, but that's an optimization you can make later.

In your example, if a client left the game, then unlink their item from the live list and add it to the dead list. If a new client joins, then grab the first item in the dead list and add it to the end of the live list. No memory allocation/deallocation during runtime. Just linking and unlinking items in linked lists. Very fast and efficient. To update all active clients, just iterate through the live list. Simple.

When updating items, it is best to only update those items that affect players, ie. items that the players can see. There is no point in wasting processor time updating items that are out of range of players. We do that in our games (3D platformers for consoles) and we only have a small number of items relative to the number that would exist in a MMORPG.

Database access will become your bottleneck when the number of clients increases. Keep it all in memory and only output to database when you need to.