@What_a_W0nderfu1_W0r1d у функций есть:
а) собственное лексическое окружение, в котором записаны переменные.
б) скрытое свойство scope, в котором содержится ссылка на внешнее лексическое окружение.
let counter1 = makeCounter() передает в переменную counter1 анонимную функцию с инкрементированием переменной count.
Анонимная функция имеет свойство scope, которое содержит ссылку на лексическое окружение, в котором та была создана (т .е. на makeCounter) и запоминает его.
Потом, ты вызываешь АНОНИМНУЮ ФУНКЦИЮ (!!!) с помощью переменной count1 -- count1(), вот так. Функция ищет в своем лексическом окружении переменную count, не находит и обращается через scope к лексическому окружению на уровень выше, т.е. к самой makeCounter, в котором ее находит.
Scope makeCounter'а, кстати, ссылается на window, и, если не находит переменную в своем окружении, может взять ее снаружи, прямо глобальную, да.