{
thread gameThread(game_loop, ref(star_pleced), ref(staircase_placed), ref(c), ref(t_placed), ref(r_placed), ref(p_placed), rows, cols, ref(map));
thread monsterThread(monster_move, ref(map));
gameThread.join();
monsterThread.join();
refresh();
} while ((c = getch()) != '0');
Этот код запускает потоки (они один раз исполняются) потом ждет их завершения. И это в цикле.
Проблема в том, что на каждой итерации этого цикла вы будете ждать, пока monster thread спит.
Потоки тут вообще бесполезны, вы с тем же успехом можете просто вызвать функции напрямую.
Потоки должны быть запущены один раз и работать в фоне. Тот, который каждую секунду что-то делает, должен внутри содержать цикл и работать бесконечно, на каждой итерации засыпать на 1 секунду.