Видится только такое решение: добавить в таблицы products_videos и product_groups_videos колонку position, в которую сохранять порядковый номер видео в списке. То есть для этого примера:
Есть Товар 1 к которому относятся видео 4,1,3
у видео 4 position = 0, у видео 1 position = 1, у видео 3 position = 2 (точнее не у самих видео, а у записей в таблицах-связках). И потом сортировать по этой колонке.
А позиции эти можно задавать при создании товара и группы. Или вообще сделать, чтобы они автоматически проставлялись в зависимости от порядка загрузки видео.
По поводу выборки, должно получится что-то вроде этого: Product.find(1).videos.order('product_videos.position') — но я не уверен, что тут будет доступна product_videos для сортировки, не помню, какой запрос делается при has_and_belongs_to_many.
Всё это в теории, но, по идее, должно сработать. :)