This just reflects what scripters asked for at the time each feature was implemented. I can see scripters asking for either behaviour ie. mIRC saving all current variables or only non-temporary variables.

That said, /saveini applies to hundreds of settings while /hsave is specifically designed for hash tables. They are not the same type of feature. In addition, variables are saved automatically in many different situations, eg. closing the script editor. So you cannot have a switch for that. My guess is that it was simply decided long ago that all variables should be saved, regardless of whether they were temporary or not.

Perhaps a better implementation for temporary %variables would have been to save an expiry timestamp for each variable. This would probably require a separate ini/mrc file. That way, even if mIRC crashed, the timestamped variable would persist until it actually timed out, even if you exited/restarted mIRC multiple times.