Делаю так:
// HTML
<link rel="icon" href="/static/favicon.png" id="id_favicon">
// JS
let state = 0;
let elem = document.getElementById("id_favicon");
elem.href = "favicon_" + state + ".png";
JS-код смены иконки исполняется часто: раз в секунду: state может меняться с этой частотой.
Когда вкладка в фоне, то при смене иконки я вижу на серваке запрос на соответствующий файл (сервак отвечает 304 - «не поменялось, уходи»). При смене иконки у кучи клиентов на сервак летит куча таких запросов. Они вроде ничего не стоят, сервак тратит меньше микросекунды на каждый, но они бесят, засирают логи и вообще и не нужны. Я не хочу фичу «дизайнеры поменяли иконку и открытая страничка в фоне сама её подтянула» - клиенты перебьются без этого. Короче, как без запросов?
Я понимаю, что движок браузера не знает что ему запихнут в href и честно ходит за файлом, который указали. И вообще это раузмно с его точки зрения - при любом изменении этого атрибута пойти и проверить не поменялся ли файл. Но мне оно не надо.