IN
(SELECT T1.OHDISC FROM spefil.OHTRNP AS T1 INNER JOIN spefil.CDTRNP AS T2 ON T1.OHSODN = T2.CDSODN AND T1.OHODCC = T2.CDODCC AND T1.OHODYY = T2.CDODYY AND T1.OHODMM = T2.CDODMM AND T1.OHODDD = T2.CDODDD
WHERE (T2.CDCHID = CH.CHID OR (CH.CHBAID > 0 AND T2.CDCHID = CH.CHBAID)))))

Hier stellt sich die Frage, warum du über die T1 an die T2 verknüpfst und dann ausschließlich aus T2 mit CH vergleichst.
Kannst du nicht direkt as der CH auf die T2 zugreifen oder wenigstens in der Where-Klausel einen Bezug zu CH herstellen?

Ein " abc in (select ...)" lässt sich häufiger und damit performanter durch "exists (select * from ...)" ersetzen. Beim "in" wird eine Liste ermittelt und dann durchsucht, beim Exists wird 1 Zugriff (am besten mit Index) gemacht.

Und ansonsten gilt dies, was hier schon vielfach diskutiert wurde:
STRSQL setzt Optimierungsoptionen die im Dialog das schnellste Ergebnis liefern sollen, da eher selten das gesamte Ergebnis gebraucht wird.
Embedded SQL macht dies genau anders herum.
Steuern kann man das im embedded per "optimize for first n rows" (o.ä.) und im STRSQL per F13->1.