Ok, acabei fazendo isso:
CREATE TABLE test (
from_ts TIMESTAMPTZ,
to_ts TIMESTAMPTZ,
account_id INTEGER DEFAULT 1,
product_id INTEGER DEFAULT 1,
CHECK ( from_ts < to_ts ),
CONSTRAINT overlapping_times EXCLUDE USING GIST (
account_id WITH =,
product_id WITH =,
period(from_ts, CASE WHEN to_ts IS NULL THEN 'infinity' ELSE to_ts END) WITH &&
)
);
Funciona perfeitamente com infinito, prova de transação.
Eu só tive que instalar a extensão temporal que será nativa no postgres 9.2 e btree_gist disponível como uma extensão em 9.1
CREATE EXTENSION btree_gist;
nb :se você não tiver timestamp nulo, não há necessidade de usar a extensão temporal, você pode usar o método box conforme especificado na minha pergunta.