Hum, this probably does not really answer your question, and I am not even sure I really understand your question, but it seems to me that the intermediate results are not always integers, but sometimes rats. So that when you multiply them, even if you end up with something looking like an integer, it has been computed as a rat.
Removing the list product from your function to see the list of computed values:
sub infix:<list_vals> { ($^n ... 0) Z/ 1 .. $^p }
say 10 list_vals 3; # -> (10 4.5 2.666667)
sub infix:<choose> { [*] ($^n ... 0) Z/ 1 .. $^p }
say 10 choose 3; # -> 120 (rat)