Дело в том, что функция в языке JavaScript - это объект, то есть она является значением. Её можно запихнуть в переменную. А потом эту переменную можно вызывать, как функцию.
Пример:
var f = function() { alert(123) }; //записали в переменную f целую функцию.
f(); //вызвали функцию в переменной.
Можно даже пойти дальше по этой логике. Ведь alert - это тоже функция.
var f = alert;
f(123);
В общем, надеюсь, логика понятна. Что касается вашего кода, то в нем из названия функции makeCounter очевидно, что она создаёт счетчик, то есть создает то, что умеет считать. То есть создает функцию. Вот и получается, что нужно вернуть функцию. Записать это можно по-разному, в том числе и в одну строчку, которая начинается с return function.
Ниже в строке:
let counter = makeCounter();
Мы как раз создаём эту функцию. То есть функция помещается в переменную counter. И чтобы это произошло, функция makeCounter должна вернуть функцию в качестве значения. Это и происходит.