Как/почему функция-генератор присваивается переменной?
это особенность функций генераторов. 
вызов $collect = collect(); возвращает объект \Generator
а потом вы уже итерируетесь по этому объекту.
Почитайте внимательно про yield.
Если упрощённо, то в момент присвоения как раз таки и происходит вызов, однако yield выполняется после того как к нему обратится метод, работающий с генератором. Например foreach.