The technical jargon for .for_each() and for x in y iteration is Internal Iterator and External Iterator (wikipedia).
In the simple case they'll compile down to pretty much the same machine code. I remember reading an email from early on in Rust's development where they only had internal iterators, and apparently LLVM was able to generate better machine code.
Iterators using callback closures are more restrictive about borrow checking. For example:
b.iter().inspect(|_| result += 1).for_each(|x| result += *x);
won't compile, because only one closure can borrow result as mutable. When the code is outside closures in regular flow of a function, the borrow checker can analyze it better and allow more.