Right, after looking into this I remember why I was concerned about /parseline when I first added it to mIRC. This is actually a good example of why /parseline can be tricky to use. The /parseline command simulates server events. mIRC expects server events to arrive in a specific order and format. If a scripter uses /parseline in a way that does not match the expected order and format of events, mIRC will not behave the way you expect.

Does a server normally send an empty nicknames list to the client while it is joined to a channel? Not that I am aware of.

As a scripter, you will need to mimick event formats and their order as closely as possible. It is not enough to think "an empty numeric 353 will clear the nicknames list". There are all manner of internal flags that track events, eg. keeping a channel window open during a disconnect/part/hop for an automatic rejoin will result in the next JOIN adding your nickname to the nicknames list. But it does not do that if the channel window is open and another JOIN is received for no reason. While I could change this particular behaviour, there are numerous similar behaviours.