Again, just discussing to make sure I understand the ask:
In which case I’m not sure how xShouldDelay helps, as that is something set on entry rather than exit. In regards to when the function exits, I don’t think there is any difference between the behaviour of this function than any other that blocks. The scheduler will always unblock a task at the right time, no matter what that task is blocked on (vTaskDelay(), vTaskDelayUntil(), or an object such as a queue, semaphore, stream buffer, etc.) - but in all cases just being unblocked does not mean the task runs as in all cases the task will only run when it is the highest priority task able to run. So in the case of, for example, blocking on a queue with a timeout of 250ms the task will get unblocked after 250ms but will only execute when it is the highest priority task so might not necessarily return from the queue receive function until some time later.