timestamptz AT TIME ZONE's usefulness is marginal at best - and in any case should not be used in subqueries. Pass the original timestamptz typed value around until you are ready to send it to the user.
Just to clarify that a bit - usually query results as passed to another layer which then presents the results to a person. Pass that layer a timestamptz and let it decide how to deal with presentation. If psql is used as the client presentation layer then you will need to use AT TIME ZONE (or TimeZone GUC depending on the situation) but that still falls within the general idea of pushing display as close to the user as possible.