This is a hunch, but it could be to do with the way recent versions of Windows 10 from version 18xx onward use timers. They issue about 2000 interrupts/second polling timers and the order of preference of timers cannot be overridden. The only workaround that worked for me on KVM was to expose an emulated hyperv clock with hv_synic and hv_stimer enlightenments. Because hyperv is the only clock source with higher precedence, Windows will switch to using it, and it has a much lower hard-coded interrupt poll rate.
I don't know if the same workaround is available with Virtual Box, but for finding the root cause I'd start looking at whether those timer interrupts are being polled 2000 times per second.
As a cross-check, if you can get your hands on Windows 10 release 1709, try that. If idle CPU usage goes down dramatically compared to what you have now, you have found the root cause.
Edit: I just noticed you are using 2K3. Switching of HPET in VM settings may be sufficient to fix your problem. See here for how: