Debe dividir las matrices de nivel superior y verificar los elementos desde allí:
select distinct id, content
FROM test
JOIN lateral (
select elems
FROM jsonb_array_elements(content) jae(elems)
) all_arrays ON TRUE
WHERE elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
ORDER BY 1;
En cuanto a la mejor manera de hacer esto, eso depende mucho de sus datos reales:cuántas filas, qué tan grandes son estas estructuras jsonb, etc. Sin embargo, en general, una búsqueda como me gusta '%3%' se beneficiará de los índices basados fuera de pg_trgm porque no pueden usar índices btree tradicionales.
Editar:la consulta de @Abelisto en los comentarios es mejor porque debería ser más eficaz, especialmente si el contenido puede contener miles de elementos:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);