Пояснение
В первом случае происходит запуск setTimeout с третьим и последующими параметрами (т.е. с передачей параметров в callback-функцию). Метод setTimeout "фиксирует" значения этих параметров в момент установки таймера.
Во втором случае по таймеру запускаются десять анонимных функций. Хотя директива let в цикле for создаёт новое лексическое окружение (scope), анонимные функции используют глобальную переменную x, которая была объявлена до цикла и которая стала 9 после завершения всех итераций цикла.
В третьем случае каждая из десяти анонимных функций взяли значение для i из своего собственного scope, которое создалось при каждой итерации цикла.