As you said this is not a bug, just how binvar were implemented. They get destroyed at the end of the script execution.
You can get the same behavior with regular %variable by using /set -u (same as /set -u0). /set -u %variable and binvar are called semi global for this reason, they are not fully global, but not fully local either.
mIRC does not have a way, good or bad, to pass binvar to aliases or command unless the command is explicitely made to support binvar, which is probably why they were implemented that way, so you can access them in nested aliases calls.
including any asynchronous calls like $urlget. This isn’t a bug—mIRC’s designed this way to let binvars pass data across events—
Note that this is wrong, $urlget has nothing to do with it and you cannot pass binvar across events, as events always trigger in different script execution, with the exception of on signal perhaps.
Just like /timer, $urlget always triggers after the script's execution in which it was called ends, meaning the binvar that you created prior calling $urlget are ALWAYS lost when the callback alias of $urlget triggers, you're probably confused if you use the binvar output mode of $urlget, then it is mIRC who creates the binary variable for you, prior calling your callback alias, and mIRC does that in the same script execution, obviously.