Wie Birgitta sagte, skalare Subselects sind grundsätzlich in Klapper ähm... Klammern zu setzen.

Fetch first 1 rows only optimiert hier gar nichts, denn dies wirkt grundsätzlich nur auf das Ergebnis und nicht auf den Count oder einen Where.
Je nach Index oder sonstigen Rahmenbedingungen kann ebenso ein Tablescan erfolgen.

Der Count(*) ohne Where ist sowieso bereits SQL-Optimiert.

Daher folgende Vereinfachung:

CREATE FUNCTION rptrade/zaehler /*10.10.19 14:34*/
( DEBITOR dec(08) ) RETURNS
CHAR(04) LANGUAGE SQL READS SQL DATA BEGIN
return
case when (select coalesce( count(*), 0) from dat020) = 0 then 'XXXX'
else '0001'
end;
END;

Der Coalesce ist erforderlich, da ein Subselect auch schon mal NULL zurückliefert wenn keine Daten vorhanden sind.

Allerdings frage ich mich noch, wofür du den Eingangsparameter DEBITOR benötigst. Fehler der ggf. im Count?