I can not understand why this code does not replace foo on bar
Because the dot . explicitly does not match newline characters.
This would work:
"foo\r\nbar".replace(/foo[\s\S]+/m, "bar")
because newline characters count as whitespace (\s).
Note that the parentheses around foo are superfluous, grouping has no benefits here.