Как придумать архитектуру сервера на c++?
В целом совет простой и стандартный: рисуете три элемента - входящие данные, игра, исходящие данные (для сервера и для клиента). Далее делаете декомпозицию каждого элемента - от сложного к простому. Повторяете несколько раз вниз до самого простого элемента. Далее структурируете и организовываете вашу архитектуру логически в объекты, методы, классы, модули и прочее. Например: раз, два.

как можно реализовать сами комнаты?
Структурой.

Можно ли представить комнаты потоками?
Можно, но не нужно. Это несколько разные концепции. Комната - это набор данных. Поток - это процесс обработки данных.

Тогда получится ли корректно работать с двумя игроками в одном потоке?
Вполне. Обратите внимание на существующие онлайн игры - тысячи и миллионы игроков.

Или каждый игрок обязательно должен быть самостоятельным потоком, и информацию о комнатах нужно хранить отдельно?
Опять путаете процесс и данные. Игрок - это тоже данные.
Можно на одну комнату один поток, тогда сокеты игроков делаете не блокирующими и используете асинхронные сетевые операции с двумя сокетами в одном потоке.
Но если уж делать сокеты не блокирующими, тогда ничего не мешает в одном потоке обрабатывать сразу несколько комнат. Обычно создают пул потоков по количеству ядер процессора и размазывают всю нагрузку по всем потокам. Но надо добиться того, чтобы обработка данных игроков в одной комнате происходила в одном же потоке, так избавитесь от разделяемых данных и не надо будет синхронизировать потоки (мьютексы и т.п.).