Надим Закиров, в дополнение к ответу предыдущему. Важно понимать, что все переменные примитивных типов, как undefined, null, NaN, Infinity - это единственные переменные указывающие на свои единственные значения, которые указывают на одну область памяти, поэтому присваивая переменной эти значения вы автоматически удаляете ссылки на другое значение 'до' этой переменной и тем самым даёте сборщику право освободить память при следующем обходе сборщика мусора. Но не раньше. Значение в памяти будут сохранены, даже когда ссылок на них уже нет, удаление их - задача сборщика и тут ничего не поделаешь, нужно ждать его очереди.
Если это работает, то проблема решена. Но рефакторинг не помешал бы)
Из простого, не используйте конкатенации строк, к примеру, используйте string templates.
Будет намного красивее и понятнее выглядеть.
И что-то вы с setTimeout прям накрутили. Зачем такие биндинги там?) Такой код тяжело читать. Используйте функции стрелки, к примеру, если вызов функции нужно отложить с нужными параметрами. Туда и пихайте и минуты и секунды.
setTimeout( () => changeTitle(minutes, seconds), 1000 );
А не известно, смотря насколько загружен стэк. Поэтому нужно использовать Date.
Я не знаю php совершенно, пробовал - не понравилось, с тех пор его не трогаю. Но в вашем случае все просто, на странице js это сильный инструмент, используйте напрямую манипуляции с DOM, это не страшно совсем, т.е. document.title ="время таймера" вполне сработает. Присваивайте только готовую строку в нужном формате.