Что я не понимаю в замыканиях?
Ну,   до меня уже все написали, но попробую по-другому, вдруг так понятно будет.
Суть замыканий в том, что вокруг функции замыкается ее контекст - окружение, в котором она была написана (именно написана, а не вызвана, поэтому еще иногда замыкания называют подробнее - замыкания лексического контекста). Это означает, что она всегда "видит" переменные, имеющиеся в этом контексте, даже если вызывается в совершенно других местах, где этими переменными и не пахнет.
В данном примере у вас function(x)
замкнута в контексте функцииinBetween(a, b)
и поэтому будет всегда видеть переменные a и b.
--
И выходит, что переменная val является параметром function(x)
Это уже не про замыкания, это больше про функции высшего порядка.
Вот аналогичный фильтр, но немного проще:function filter(arr, a, b) {
var result = [];

for (var i = 0; i < arr.length; i++) {
if (arr[i] >= a && arr[i] <= b) {
result.push(arr[i])
}
}

return result;

}

var arr = [2, 5, 12, 66, 7, 4, 8, 3, 10]

filter(arr, 5, 10)