There's basically nothing you can do in pure Python that would ever truly suspend your code and cede control back to the event loop, making it wait for something to complete. Because your Python code will pretty much always just be CPU bound, and not wait for anything else.
You need to "step outside Python" to encounter something that needs actual awaiting. Like, making a network request and waiting for its response. Or asking the operating system to open a file and read its contents; depending on where that file is being read from, that can take a relative eternity, compared to all the things Python could be doing on the CPU in the meantime.
Things like these rely on underlying operating system infrastructure for the most part. E.g., to send a network request and awaiting its response, you'd open a port, send a request to some target, and then do nothing until something comes back on that port. The operating system coordinates this kind of thing, and has the necessary hooks for you to say "wake me up when anything happens here".
There's no direct interface to these things from pure Python; this is happening in the underlying C libraries. Python exposes some primitives in the asyncio module like create_server, and higher level abstractions like streams.
So, if you await some async Python code, that only coordinates causality. Meaning, code after this will only continue once this function has completed. But if that function never actually calls out to one of the primitives described above, then that mostly has no effect. Only if somewhere at some point you are calling one of those primitives which truly suspend Python processing, awaiting completion of some external event coordinated by the operating system, does it really have an effect. But even if that call is ten levels deep, your entire chain of Python code before that needs to be properly async and awaited, if you want to coordinate asynchronous causality throughout your program.