That $PF in list context is invoking split+glob. The contents of $PF is split according to complex rules involving the $IFS special parameters (which have nothing to do with what happens when bash interprets the printf %s\n code for instance), and then the resulting words are subject to filename generation (aka pathname expansion aka globbing).
So, here, there are at least 2 problems:
the behaviour of that $PF is dependant on the current value of $IFS. By default, in bash, $IFS contains space, tab and newline, and here you do want $PF to be split on space, and the string otherwise doesn't contain tab nor newline. But in a context where $IFS has been changed to % for instance, you'd end up running the "printf " command with "s\n" as argument.
In some versions of bash (namely 5.0, I believe it was reverted in 5.1), \ is a globbing operator (at least like here where it comes from some parameter expansion and is not otherwise used for quoting).
With failglob or nullglob options on, that would mean:
$ PF='printf %s\n' bash-5.0 -O failglob -c '$PF test'
bash-5.0: no match: %s\n
$ PF='printf %s\n' bash-5.0 -O nullglob -c '$PF test%d'
test0
And even without those options:
$ PF='printf %s\n' bash-5.0 -c '$PF test'
test
$ touch %sn
$ PF='printf %s\n' bash-5.0 -c '$PF test'
testn
See @cas' fine answer for what to do instead.
%s\n. Also, you're likely to run into all sorts of quoting-related annoyances by trying to do this with a variable.