I appear to have found the answer.
The value for the TXT record needs to be wrapped in quotes - i.e. the string needs to have quotes within it:
update.replace('myhost', 60, dns.rdatatype.TXT, '"xxx yyy zzz"')
Works perfectly:
$ host -t ANY myhost.dyn.example.com
myhost.dyn.example.com descriptive text "xxx yyy zzz"
myhost.dyn.example.com has address 1.2.3.4
Yay :-)