Это не цикл и не передача по ссылке, это closure. При создании lambda (или def, между ними нет разницы) запоминает ссылку на окружающее пространство имён, в котором есть ссылка на переменную i. Даже если ссылка i потом изменится, lambda-то помнит не i, а то пространство имён, в котором определена i, ну и lambda найдёт в этом запомненном пространстве имён новое значение i.
no subject