Creo que el problema es que la declaración dinámica que está intentando en su EXECUTE IMMEDIATE es una sentencia SQL, no una sentencia PL/SQL. Y INTO no es SQL, es PL/SQL.
Puedes hacer un SQL dinámico declaración con solo una variable de vinculación y luego coloque su INTO fuera de la instrucción dinámica. Esto es compatible cuando se hace un SQL dinámico declaración:
execute immediate 'select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end from DUAL'
into varResult
using IN varSampleCode;
O puede hacer un PL/SQL dinámico bloque anónimo:
execute immediate 'begin select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end into :varresult from DUAL; end;'
using IN varSampleCode, OUT varResult;
Esta vez el INTO debe estar dentro de la cadena dinámica y usar una variable de vinculación, porque con BEGIN y END; ahora estás haciendo PL/SQL dinámico .
Para su caso de uso, recomendaría la primera opción, hacer SQL dinámico y colocando el INTO después la cadena de sentencia.