Esse comportamento está correto de acordo com os padrões ANSI.
Se o nome de coluna não qualificado não for resolvido no escopo interno, o escopo externo será considerado. Então, efetivamente, você está fazendo uma subconsulta correlacionada não intencional.
Desde que a tabela
profile contém pelo menos uma linha então FROM users
WHERE user_id IN (
SELECT user_id FROM profile
)
acabará correspondendo a todas as linhas em
users (exceto onde users.user_id IS NULL como WHERE NULL IN (NULL) não avalia como verdadeiro). Para evitar esse possível problema, você pode usar dois nomes de partes. DELETE FROM users
WHERE user_id IN (SELECT p.user_id
FROM profile p)
Daria o erro