filter(arr, inBetween(3, 6))
Когда вызывается функция filter, в эту функцию передается результат вызова функции inBetween с аргументами 3, 6, эти аргументы сохраняются в замыкании, сама же функция inBetween возвращает функцию
function(x) {
return x >= a && x <= b;
};
Которая и передается уже в функцию filter как аргумент func, и когда преданная функция вызывается внутри filter, то она достает аргументы 3 и 6 из замыкания, а и принимает аргумент x, которые внутри filter передается как val