Dijiste que no quieres, pero:usa una tabla temporal. Esa es la solución correcta aquí.
El análisis de consultas es costoso en Oracle, y eso es lo que obtendrá cuando coloque miles de identificadores en una burbuja gigante de SQL. Además, hay límites mal definidos en la longitud de la consulta que vas a alcanzar. Hacer un anti-JOIN contra una mesa, por otro lado... Oracle es bueno en eso. Carga masiva de datos en una tabla, Oracle también es bueno en eso. Usa una tabla temporal.
Limitando IN
a mil entradas es un control de cordura. El hecho de que lo estés golpeando significa que estás tratando de hacer algo loco.