Could this be related to the fact that only a subset of sprintf is linked? If you try “%f” you won’t get anything either since floating point printing is not linked in by default.
Flags:
...
0 Left-pads the number with zeroes (0) instead of spaces, where padding is specified (see width sub-specifier).
(my emphasis)
Slightly further down:
width description
(number) Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces.
* The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
(my emphasis again)
I read this as that the zero-padding only applies for specified padding, not *-padding.
I admit the documentation is obscure, and what you have possibly found is a library bug, rather than an error in your interpretation.
You probably should get a second opinion. I could have been in the wrong place or looked at the wrong source files. I think this was the third time ever I've been to the AVR LIBC website.
At a minimum, try this...
// Your code included here as a place-marker
sprintf (temp_string, "%0*X", 3, 0xAA); // doesn't work
Serial.println (temp_string);
HexDump();
// So you know where to put this snippet
sprintf (temp_string, "%z", 3, 0xAA); // illegal specifier
Serial.println (temp_string);
HexDump();
If the output is identical to the "%0*X" format string then there is a good chance I'm correct.