При первом вызове этой строчки кода:
return function () {return counter += 1}
Js не найдет переменной counter в данной функции. После этого Js перейдет на 1 уровень вверх, чтобы поискать, не объявлена ли переменная counter выше. Переменная counter будет найдена и ее значение будет равно 0.
Стоит учесть что при выполнении этой функции, все переменные использованные в ее теле - сохраняются, то есть при последующих вызовах внутренней функции значение counter уже будет определено.