Esta es una solución a mi problema. Resuelve el problema usando la función PostgreSQL para reemplazar el ?
operador.
Realmente no me gusta porque no hace que PDO cumpla más con PostgreSQL. Pero no encontré una solución real.
CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$
SELECT $1 ? $2
$f$;
Y ahora puedo usar la consulta:
SELECT * FROM post WHERE json_key_exists(locations, :location);
La solución fue sugerida por el fabuloso RhodiumToad de freenode #postgresql
Editar
Como sugirió @Abelisto, no es necesario crear la función anterior como jsonb_exists(jsonb, text)
es avialabe