Punkt 1:
Ersetze den " in (Select ...)" durch einen exists (select * ...).
Begründung:
der "in ()" wird je Quellzeile ausgeführt und liest alle Zeilen der Whereklausel, der Exists wird auch je Zeile ausgeführt, versucht aber über Index nach Möglichkeit nur 1 Zugriff.

Punkt 2:
Betrachte deinen in (select..)

Code:
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)))))
Da deine Where-Klausel nur die Tabelle T2 benötig dreh den Join u.U. einfach um.
Du könnteste zusätzlich statt einem "in Select" 2x Exists-Select verwenden.

Punkt 3:
STRSQL und ACS-SQL optimieren für die schnelle Erstanzeige, da i.d.R. nicht alle Sätze des Selects angesehen werden.
Mach dann aber mal in STRSQL die Eingabe "B" um alle Zeilen zu laden, dann wirst du auch hier die schlechte Performance sehen.

Punkt 4:
Manchmal macht es Sinn, die Felder der Gesamt-Where-Klausel an den Anfang zu stellen gefolgt von den Exists-Select.

Punkt 5:
Nur für die Lesbarkeit lege den Exists-Subselect mal separat in eine CTE, dann wird der SQL übersichtlicher.

Punkt 6:
*SORTEDPTL deutet auf eine intern erstellte sortierte Tabelle hin, die vorab ja erst mal aufgebaut werden muss. Wenn man sich diese sparen kann, zu mal du ja keinen Order By hast, ist schon viel gewonnen.