Is there a way to speed up JOIN ON LIKE?
The initial problem is the left join.  That restricts it to using things as the driving table, but once you do that there is no way to use the indexes, as pg_trgm and text_pattern_ops offer ways to index for texts matching a given pattern, not for patterns matching a given text.

In order to use an index on the left join, you would have to first do a nested loop with match_group_rules driving, memorize all the rows of things retrieved, and then go back and make up NULL rows for the things not found.  There is no inherent reason that I can see that PostgreSQL wouldn't be able to do this complex operation, it just isn't implemented.  You can do it yourself with a CTE and a UNION ALL:

with foobar as 
(select t.id as t_id, name, r.id, r.group_id, r.rule
   from things t
   join match_group_rules r 
     on t.name like r.rule || '%'
)
select * from foobar 
    union all
select id, name, NULL, NULL, NULL from things t2 where not exists 
 (select 1 from foobar where t2.id=foobar.t_id);