This. Data and transformations on data (map, filter, reduce, etc) are trivially composable. Imperative loops are not (unless you abstract them away behind a function that accepts and returns data, in which case you'd be re-implementing map, filter, reduce with imperative loops).
For loops are just clunky. They're not values, you can't pass them around or copy'n'paste them where the transformed value is needed.