DigitalRossがすでに述べたように、これはO(n ^ 2)であるため、これは非常に低速です。そのeqlを仮定しますか?==と同じように問題ありません。代わりに、インデックスを作成して繰り返し処理することができます。代わりに、O(n + m)になります。
array1 = [obj1, obj2, obj3, obj4]
array2 = [obj1, obj2, obj5, obj6]
index  = {}
found  = []
array1.each do |item1| index[item1.first(2)] = item1 end
array2.each do |item2|
  item1 = index[item2.first(2)]
  found << [item1,item2] if item1 then
end
found.each do |item1, item2| puts "do something" end
これは、array1のすべての要素の最初の2つの要素の組み合わせがarray1内で一意であることを前提としています。そうでない場合、コードは少し複雑になります。
array1 = [obj1, obj2, obj3, obj4]
array2 = [obj1, obj2, obj5, obj6]
index  = {}
found  = []
array1.each do |item1|
  key          = item1.first(2)
  index[key] ||= []
  index[key]  << item1
end
array2.each do |item2|
  items_from_1 = index[item2.first(2)]
  if items_from_1 then
    found.concat(items_from_1.map { |item1| [item1,item2] })
  end
end
found.each do |item1, item2| puts "do something" end
サンプルデータを提供しなかったため、コードをテストしませんでした。
それがお役に立てば幸いです。