Postgres tsrange index for small sliver of time
I think that there is no way to do this - making the indexed rows dependent on the current time would mean that the index has to change all the time, and that is something PostgreSQL doesn't do.
You could of course introduce a condition:
CREATE INDEX ON events USING gist
    (tstzrange(start_time, end_time, '[)'))
WHERE status = 'PUBLISHED'
  AND start_time &gt; '2021-01-01 00:00:00';

and drop and re-create the index each year (or month).
But then your queries would have to contain the same condition that changes yearly, which does not seem practical.