Em geral, há um custo para preparar cada consulta e um custo para recuperar os dados. Para conjuntos de dados pequenos, executar SELECTs em um loop não é tão ruim, mas se você estiver fazendo um SELECT em uma tabela com 1000 linhas, então para cada uma dessas linhas fazendo outro SELECT em uma tabela diferente com 1000 linhas, a diferença será ser muito perceptível, mesmo que as seleções em loop sejam executadas a partir de uma consulta previamente preparada.
Mesmo que o custo de preparar cada consulta no loop seja zero, é possível que os elementos JOINed reduzam o tamanho total dos dados recuperados. Por exemplo, se você estiver unindo sua tabela de 1.000 linhas em uma tabela com apenas uma linha correspondente, a versão JOIN da consulta retornaria uma linha, enquanto os SELECTs separados retornariam 1000 linhas da primeira tabela, com o loop produzindo 999 conjuntos vazios e 1 linha.
Se você estiver solicitando um item específico de cada tabela, em vez de percorrer um conjunto de linhas, a diferença entre uma consulta "grande" e quatro consultas pequenas provavelmente será minúscula. Como voretaq7 disse, fazer com que o postgresql EXPLAIN o que cada consulta fará e quanto tempo levará para fazer isso seria um longo caminho para descobrir exatamente o que acontecerá.