I had tried a traditional escape character, which did not work. Then I found a comment about using a '%' as an escape character and this worked. E.g.:
default = "5% foo"
foo_group.add_argument(
"--foo",
default=default,
help="Foo amount. Default: %s" % default.replace(r"%", r"%%")),
)
args = parser.parse_args()
I'm glad I don't need to replace all '%' with '[percent sign]'. Hah.