clients[socket.id] = undefined;
delete clients[socket.id];
Тут два раза делаете одно и тоже действия.
Однако при одключении клиента объект клиента никуда не девается, и продолжает ловить сообщения, и слать в отключенный сокет. Я так понимаю, что отключенный сокет тоже никуда не девается и отличается только свойствами connected/disconnected.
Все правильно, потому что в конструкторе клиента вы подписались на событие:
this.app.on('chat.sendMessage', this.sendMessage.bind(this));
но забыли отписаться при диссконнекте.