https://github.com/ray-project/ray/blob/ray-2.48.0/python/ray/_raylet.pyx#L1852
Function execute_task is where a remote function finally get executed. You can see ray just wrap your normal function (none async function) with a async wrapper and execute inside asyncio event loop.
So ray does not preempt async tasks, it just treat sync function as a async function.