You're running that command substitution with eval, so you get the quotes and escaped processed twice.
Assuming byte=41 total=3, what eval sees is the arguments printf, \x41%0.s, 1, 2, 3. It concatenates them to printf \x41%0.s 1 2 3, which after escape processing runs printf with the four args x41%0.s, 1, 2, 3. (It should print x41x41x41, here.)
Unless you want to do it the hard way on purpose, it'd be easier to use some other tools than just the shell. E.g. you could use tr to get the byte you want, but it doesn't support hex escapes, only octal with \000, so there's the trouble of converting.
$ byte=41 count=15
$ printf "%${count}s" "" | tr ' ' "\\$(printf %o $((0x$byte)) )"
AAAAAAAAAAAAAAA
Or, you could use Perl:
$ perl -e 'print chr(hex($ARGV[0])) x $ARGV[1]' 41 15
AAAAAAAAAAAAAAA