Потому что консоль лог будет вызван ДО резолва промиса, синхронно, а асинк функции возвращают промис, потому в консоли видно такое. Если у вас код завязан на асинхронность, то кроме как асинхронно с результатом не поработать, то есть консоль лог надо вызвать дождавшись промиса. Тут уже написали, как сделать, ну или делать еще одну асинк функцию, внутри вызвать первую с евейтом и только потом консоль лог.
Нужно перевести это на промисы, и дальше, возможно, использовать for await of (как один из вариантов), но сразу надо думать о поддержке браузеров, хотя по идее уже все должны уметь.
Создаете переменную, - где-то в замыкании, так чтоб функция-обработчик ее видела, - счетчик, при клике проверяете ее, если то - такой класс, если это - другой, если больше 3 - return
Ну, тут надо вспомнить, сколько минут в часе, сколько секунд в минуте и сколько миллисекунд в секунде... Дальше делим, остаток от деления берем, отнимаем, в общем, задачка 3, 4 класс по математике :)
Обычным setInterval такую задачу не решить. Интервал и таймаут дает гарантию, что колбек не запуститься раньше, чем через X миллисекунд, но он не гарантирует, что четко через это время произойдет запуск.
Для оптимизации браузер вообще может вкладку остановить и не выполнять код в ней, если она не в фокусе. Видео про таймер - тут об этом, правда на английском.