I figured out how to accomplish what I needed by modifying HTML2WordML.inc:
case 'sub':
case 'sup':
case 'span':
if ($nodo['nodeName'] == 'sub') {self::$openScript = 'subscript';}
if ($nodo['nodeName'] == 'sup') {self::$openScript = 'superscript';}
self::$WordML .= $this->closePreviousTags($depth, $nodo['nodeName']);
if(!empty($nodo['attributes']['class'][0])){
self::$WordML .= '<w:rPr><w:rStyle w:val="'.$nodo['attributes']['class'][0].'"/></w:rPr>';
}
self::$openTags[$depth] = $nodo['nodeName'];
break;
case '#text':
This allows me to assign character classes to <sup>s, <sub>s, and <span>s even when strictWordStyles = true. It works well except that the class is not applied if the <span> or <sup> is the first element in a <p>. It's probably something missing in the WordML I am inserting... My workaround is to insert a zero-length-space (​) preceding <span>s and <sup>s. Then it works fine.
I have one more issue I need to handle concerning how to embed footnotes in strings containing HTML. I'll post about it later.
Thanks.