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.