Thank you, everyone, for very enlightening answers, I've learned quite a few things from them.
Unfortunately, ShellQuote::Any::Tiny doesn't do it right:
>perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say f
+or @ARGV; <STDIN>', 1, shell_quote(qq(\x5c \x5c)), 2"
because it escapes every backslash. But only terminating one, which precedes the closing double-quote (if any), should be escaped -- as follows from "Everyone quotes command line arguments the wrong way".
Win32::ShellQuote appears to handle everything correctly.
Actually, I lived happily before this, relying only on Perl's built-in ability to double-quote arguments, which contain spaces. Until someone, in her wisdom, decided that a double-quote in the middle of template name, to be passed as argument to another script, is a good idea.