Wie immer gibts ja viele Möglichkeiten.
Der Count(*) über alles gibt dir bereits mit dem 1. Satz die Anzahl Gesamtzeilen. Damit kannst du dem User schon mal ausrechnen, wieviele Seiten es denn werden;-).

Und wie Dieter schon sagt:
Den Prepare machst du immer nur dann, wenn sich die Sortierung oder der Filter ändert.
Du hast aber Recht, dass der SQL bei jedem Open neu ausgeführt wird.
Allerdings merkt sich die IBM i den gewählten Weg so dass ab dem 2. Open es etwas schneller geht.

Was die Gesamtperformance angeht, so ist das seitenweise Lesen einer Subfile immer schlecht.
Einfacher ist es, die Subfile beim vorwärtsblättern die nächsten Zeilen zu füllen. Das rückwärtsblättern erledigt die Subfile selber.
Bei Änderung der Sortierung wird neu prepared und die Subfile wieder von Anfang gefüllt.

Wenn man Spaß hat, kann man sich den Schlüssel zur aktuellen Subfilesatz (1. Zeile der Subfileseite, steht in der INFDS), ja merken und solange füllen, bis der positionierte Schlüssel wieder erreicht wird.

Die User werden dann schon merken, dass ständiges Umsortieren u.U. schlecht für die Suche ist.
Ich bin da auch eher für eine sinnvolle Filterung, so dass der Zwang zum Blättern reduziert wird.