Effect of where statement in subquery (to get rid of unnecessary join)
Perhaps it is easier to see with the aid of some rewrites. Your first query can be rewritten to (using the same alias at different levels makes it a bit difficult to understand):

select * 
from parent p1
where exists (
  select 1  
  from parent p2
  join child c on c.parentId = p2.id
  where p2.age &gt; 50
    and p1.id = p2.id 
)


Assuming id is unique in parent this can be rewritten as:

select * 
from parent p1
where exists (
  select 1  
  from child c 
  where c.parentId = p1.id
    and p1.age &gt; 50
)


which in turn can be rewritten to your query.

So you can eliminate the join against parent inside the sub-select. However, your second query is a bit difficult to understand as it is written. I would suggest (I'm guessing your intention)

select * 
from parent p1
where exists (
  select 1  
  from child c 
  where c.parentId = p1.id
)
and p1.age &gt; 50


If parent.id is not unique the above wont hold