task.defer defers a thread at the end of the current invocation/resumption cycle, not the next.
This is correctly outlined in the task library documentation:
https://create.roblox.com/docs/reference/engine/libraries/task#defer
I think the terminology used for invocation cycle, invocation point, resumption point, and resumption cycle can get quite confusing for new developers when they all basically refer to the same thing.
Page URL: https://create.roblox.com/docs/scripting/scheduler#taskdefer