Maybe a more serious fix is something like "read -t $N". If you think stdin might not be usable (like maybe it will close prematurely) this option won't work, but maybe you can open an anonymous FD and read from it instead.
while wait && [[ $SECONDS -lt $1 ]]; do read -t $(($1 - SECONDS)) done <><(:)
{ wait; read -t $1; } <><(:)
Interestingly, it does reap on a blocked read without -t, so potentially the behaviour on -t would be considered a bug rather than as-designed.
There's also a loadable sleep builtin supplied with bash which calls into the internal fsleep() so should be reliable and without forking.
Sleeping is an OS scheduling task. Use the OS syscall that does that.
As is suggested on the Github issue that Microsoft has been ignoring for half a year.
Maybe a more serious fix is something like "read -t $N". If you think stdin might not be usable (like maybe it will close prematurely) this option won't work, but maybe you can open an anonymous FD and read from it instead.