Perhaps because you hadn't had the displeasure to work with callbacks, or promises? Which async/await greatly simplifies.
That's probably the real reason why so many people are so happy and vocal about "simplicity" of async/await – after experiencing concurrency only with callbacks in JS, async/await looks like a blessing.
So, tell me, which thread did that callback run in? And what happens if I need to grab a lock in the callback?
That's "magic".
You can't call it magic just because you haven't read what it desugars into. Otherwise anything you don't know could be called "magic".
(In computing there's not magic. There are abstractions, and it's not that always less is better).
To validly complain about an abstraction the abstraction should make reading the code (or other aspects, e.g. performance) worse.
Merely complaining that "it hides things" and that you "have to learn it to know what it does" is not a valid complaint.
That's literally what abstractions are supposed to do: hide things and introduce new things to learn (the abstraction.
So you can't use the fact than an abstraction like async/await hides things ("magic"), or introduces something new to learn, as an argument against it (unless you're against all abstractions, but this train has long sailed, and the question whether abstractions can be good is settled: yes, they can).
So, the whole point to judge an abstraction is whether the new thing it introduces makes things easier _after_ having learn it or not.
So far your arguments were just that it hides things (magic) and that callbacks made what happened clear (so, again, the hiding aspect).
The same way code using functions is easier to read than looking at the exact same code expanded in 20 places in your program, even if a function call also has "magic" (passing the arguments on the stack, replicating the behavior inside the function as it was written in the place of invocation, sometimes inlining, returning, moving the stack pointer again at the end, recursion, and so on).
You learn once how function works and that's it. More compiler behind the scenes work ("magic") than writing the same lines again and again, but easier to read.
This is a exactly how I feel as well and I write Rust code every day.
But no matter, I will suck it up. The language is evolving and I think async/await has, seemingly, been one of the biggest divisive feature the community has faced. I will still use as there are so many other benefits this language brings.