1. Вебсокетное соединение node может держать до 1 миллиона, в зависимости от железа и количества серверных нод. На джанго + джанго каналы попечальней, но думаю 1к спокойно вытянет.
2. У вк тоже нет всего списка сразу, а показывают последние 10-15 например.
3. Для диалогов делать по аналогии вк - грузить послдение 10 сообщений, а при скроле догружать еще.
4. По поводу клиента, я так понял он на vue. И вы правильно подумали, что при первой загрузке в стейтах хранитьпоследнее сообщение. Далее по клику на диалог - догружать в ячейку стейта конкретного диалога 10-15 предидущих сообщений. Но мне кажется, если догружать еще сообщения, и сделать это в несколько диалогов, то производительность может падать.
Но вдруг vue так силен. В принципе у вас ход мыслей правильный, при заполнении в стейт сообщеньками будет быстрее работать в кейсе, когда переключаешься между диалогами.