Dein Problem ist die Where-Klausel in Verbindung mit dem Group By und die spätere Verknüpfung mit dieser.
where x in (....) ist das selbe wie where a=1 or x=2
Hier kann es helfen, einen Index mit der Transaktion als 1. Feld zu erstellen.
Also "Transaktion, Firma, Artikel, Datum desc".
Ich glaube aber nicht an den Optimizer, da Where und Groupby eigentlich 2 Indizes benötigt.

zu b)
Mit diesem "scalaren Subselect" wird genau 1 Satz über die Beziehung a.key = b.key ermittelt.
In deinem Fall hilft dies auch nicht da du ja eine zusätzliche Where-Klausel mit einer OR-Bedingung hast.

Ich fürchte, du musst mit dem Performancenachteil leben.

Alternativ würde ich dir einen Trigger empfehlen, der die benötigte Information in eine 2. Datei schreibt die dann nur noch Firma, Artikel, Datum enthält.