thanks for all the ideas. I did it like this:

after I join the channel a timer is set to one minute.
the timer triggers all the users into chunks of 16 at a time (since nickserv responds to /ns status <nick1> thru <nick16>).
nickserv then is sent the chunked nicks status requests every 5 seconds.

if the nick's status is 3, then they are added to a hash table along with $ctime as the data. if the nick is already in the hash table, nickserv is not sent a status request for that nick.

as nicks join the channel, (and are not in the hash table as registered) they are chunked as well and nickserv status requests are sent out every couple minutes OR they are sent instantly if 16 nicks join within a couple of minutes (no worries about flooding, we have channel flood protection).

a timer that is triggered every few hours is then triggered to check all the nicks in the hash table. if the nick is older than 21 days (due to nicks that are not used are released after 21 days) then they are removed from the hash table.