Você disse que não quer, mas:use uma tabela temporária. Essa é a solução correta aqui.
A análise de consulta é cara no Oracle, e é isso que você obtém quando coloca milhares de identificadores em um blob gigante de SQL. Além disso, há limites mal definidos no comprimento da consulta que você vai atingir. Fazendo um anti-JOIN contra uma mesa, por outro lado... Oracle é bom nisso. Carregando dados em massa em uma tabela, o Oracle também é bom nisso. Use uma tabela temporária.
Limitando
IN
a mil entradas é uma verificação de sanidade. O fato de você estar acertando significa que você está tentando fazer algo insano.