Hai detto che non vuoi, ma:usa una tabella temporanea. Questa è la soluzione corretta qui.
L'analisi delle query è costosa in Oracle ed è ciò che otterrai inserendo migliaia di identificatori in un gigantesco blob di SQL. Inoltre, ci sono limiti mal definiti sulla lunghezza della query che stai per colpire. Fare un anti-JOIN contro un tavolo, d'altra parte... Oracle è bravo in questo. Caricamento in blocco dei dati in una tabella, Oracle è bravo anche in questo. Usa una tabella temporanea.
Limitare IN
a mille voci è un controllo di integrità. Il fatto che lo stai colpendo significa che stai cercando di fare qualcosa di folle.