Wrapping add_query_arg with esc_url not working

And the strange part: both codes echo the same string for $url!!!

No, they don’t. Look at the page source. esc_url() is encoding the & control character. You can’t do that and expect the HTTP request to work correctly.

Use esc_url_raw() instead. Note the description in the Codex concerning that function:

The esc_url_raw() function is similar to esc_url() (and actually uses
it), but unlike esc_url() it does not replace entities for display.
The resulting URL is safe to use in database queries, redirects and HTTP requests.
https://codex.wordpress.org/Function_Reference/esc_url_raw