PostgreSQL "at time zone" construct does not use index
I found a way to "cheat" which uses the index, and also has the comfort of timezone conversion.

I basically extend the date range of selection to be sure to include enough values whatever timezone the user has, and then use a wrapper select which filters the result a second time and performs the timezone conversion:

select * from (
    select
    date_trunc('minute', datetime at time zone 'UTC' at time zone 'Europe/Luxembourg') as datetime,
    round(avg(last_value), 1) as last_value 
    from impulse2 
    where account = 1 
    and sensor = 2 
    and datetime between '2016-09-07 00:00' and '2016-09-09 23:59' -- uses index
    group by 1 
    order by 1
) as r
where 
r.datetime at time zone 'UTC' at time zone 'Europe/Luxembourg' between '2016-09-08 00:00:00' and '2016-09-08 00:20:00'