Sua tentativa inicial está correta, mas você precisa usar índices btree (parciais) e varreduras de índice de bitmap para confiar nele:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
O mesmo para massa, e se o planejador não conseguir no local, adicione duas cláusulas where, ou seja,
where ext->'size' is not null
e o mesmo para a massa. Se houver algum tipo de padrão (o que é provável, já que a maioria dos produtos com tamanho também tem massa), crie potencialmente um índice de várias colunas combinando os dois - um saco, o outro desc.
O índice gin como você o escreveu, junto com a consulta que o acompanha (com um erro de sintaxe) basicamente fará a mesma coisa, mas não ordenada; será mais lento.