Deferred computation is a primitive, and threads do not solve it.
Any fundamentally blocking operations could be forced by the compiler to have have two implementations - sync (normal) and async, which defers to some abstract userspace scheduler that's part of the language itself.
You still have concurrency or interleaved execution to contend with but that could be represented more explicitly since it's not unique to async.
I haven't done much rust but implementing blocking operations as async functions is commonly achieved in Python by using threads under the hood anyway