Outer Joins to find records with no matching associated entries
If you want to stick with left join, here is how it should be. The condition you want to exclude is placed on the left join .. on part and you keep the where .. is null check:

select
    foo.*
from 
    foo
  left outer join bar 
    on  foo.id = bar.foo_id
    and bar.name in ('name1', 'name2')
where 
    bar.name is null ;


It can also be done with not exists:

select
    foo.*
from 
    foo
where 
    not exists
      ( select *
        from bar 
        where foo.id = bar.foo_id
          and bar.name in ('name1', 'name2')
      ) ;