La forma más sencilla es con not exists o left join :
select u.*
from users u left join
addresses a
on a.username = u.username and
a.city = 'Peoria'
where a.city is null;
La left join mantiene todos los registros en usuarios y cualquier registro en addresses que coincidan con on condiciones. En este caso (porque el nombre de la ciudad está en on condición), devuelve a todos los usuarios con información sobre las ciudades o NULL valores. El where cláusula elige el NULL valores -- los que no coinciden.
El not exists podría ser más fácil de seguir:
select u.*
from users u
where not exists (select 1
from addresses a
where a.username = u.username and
a.city = 'Peoria'
);