Bah, you people post too fast.

@Feenixtrite
Ok. Might've found something.
objGame.objPlayer.0x3C: (value 1) Current amount of time orbs.
objGame.objPlayer.0x44: (value 2) Total amount of time orbs for this stage.
One of those values (0x3C) is actively updated and used but the other (0x44) is only used in 00418220, which adds parameter_1 time orbs. Both values are updated when time orbs are obtained/lost except for one situation: when losing time orbs. The relevant pseudocode looks like this...
...
if( P08_Quantity < 0)
if( [[L04_GameObj+08]+3c] < -P08_Quantity)
[[L04_GameObj+08]+3c] = 00000000
return
[[L04_GameObj+08]+3c] = [[L04_GameObj+08]+3c] + P08_Quantity
[[L04_GameObj+08]+44] = [[L04_GameObj+08]+44] + P08_Quantity
...
Notice anything? When losing time orbs, if we have less orbs remaining than what we want to lose, we set 0x3C to 0 (instead of subtracting and getting a negative number) BUT NOT 0x44. This means losing time orbs past 0 will only affect 0x3C and not 0x44, leaving the latter with whatever it had in the first place (ie, a higher value than 0x3C now has). So while the displayed value is under the required amount of time orbs, the internal value can be several hundred points off.
Edit: Seems you figured that out as well.

Edit 2: For those who want it, here's a link to the unaltered
00418220 routine. ecx is loaded up with the main "game" object and the stack contains the quantity to alter the time orbs by.
Okay, wrote a patch for this. Because, why not.
DownloadJust run it in your IN folder. It'll create the file "th08e-timefix.exe" and leave your original exe untouched. Enjoy!