El ST_DWithin la documentación establece que la firma de la primera función acepta tipos de geografía, no tipos de geometría:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
dado que (ubicación, ST_SetSRID (ST_MakePoint (20, -30), 4326)) son todas geometrías, tendría sentido que la ejecución de la función sea desordenada. Y creo que su segunda función funcionó correctamente porque lo que estaba ejecutando era esta firma :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Y como dijo que cambiar los tipos de columna a Geografía en lugar de Geometría resolvería el problema, ya que eso le daría la ejecución correcta de:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
Espero que esto ayude un poco.
Editar:
Encontré esta parte en la documentación que establece que al ingresar los datos
esto podría explicar por qué Postgres aceptó su primera invocación de ST_DWithin() ya que postgis aparentemente lo enviaría a la geografía, y eso también explica por qué la ejecución lleva más tiempo y descuida el índice, ya que cada conversión daría como resultado un nuevo objeto que no está indexado en su columna original.