Не все участники есть в кэше клиента. Они появляются там тогда, когда бот каким-либо образом повзаимодействовал с участником. Добавление интента
GuildPresences
добавляет участников в кэш, так как вы даете знать Discord Gateway, что хотите получать информацию о презенсах участников. Gateway отправляет клиенту эту информацию при старте и добавляет участников в кэш, НО только тех, кто не офлайн и не указал невидимый статус. Следовательно если у участника невидимый статус и он ни разу не взаимодействовал с ботом и он выйдет из сервера, то событие
guildMemberRemove
будет проигнорировано, так как этого участника нет в кэше.
Почему так происходит?
Это сделано для таго, чтобы вы всегда могли быть уверены, что в событии придут все данные; то есть и новые данные участника, и старый. Так как Discord не отправляет старые данные, то они берутся из кэша, а раз их в кэше нет, значит данные неполные и событие не срабатывает.
Решением этой проблемы являются партиалы, которые дают знать клиенту, что вы готовы к получению неполных данных. Неполные данные означают, что в данных может содержаться только id и ничего другого.
Подробнее о партиалах