To answer my own question: I replaced the 'han (script name symbol) with cons'd ranges
'(#x3400 . #x4dff) '(#x4e00 . #x9fff) '(#x20000 . #x2bfff)
to the CJK unicode blocks in 3 different calls. That works.
Apparently overlapping font definitions using script name symbols and ranges are evaluated somewhat nondeterministically, so I got sometimes one and sometimes the other.