The existing answers have already been discussed (and well) the functional nature of Ruby (by the way, I have a post here that may be interesting). Now, answering your question: I would say that - from any point of view, not just FP, just common sense - the filter operation should always return an object with the same type of original. Some comments on your question:
1) You are wondering why Hash#find_all (= Hash#select ) returns an array. In fact, this makes no sense, especially when the Hash#reject returns the hash.
>> {:a => 1, :b => 2}.select { |k, v| v > 1 }
But this has long been considered a mistake and, fortunately, was solved in Ruby 1.9:
>> {:a => 1, :b => 2}.select { |k, v| v > 1 }
2) The second example ( String#each_char ) is not really related to this problem. This method returns an enumerable ("lazy array", if you want) characters in a string, so select / reject / ... 'over over returns an array that is correct. Well, to be orthodox, they must return a lazy enumerator, but Ruby still has room for improvement (check out the Facets Denumerator to see a good way to do this).
3) @ Ed'ka introduced a related and interesting concept to the discussion: fmap . fmap is a generic version of the map for functors (which are just containers in which you can iterate. Examples of functors: list, tree, associative array, set, ...). In Ruby, we may wonder what Hash#map should return .. an array? hash? in Haskell, for example, map makes sense only for lists (although it has a completely different nature, the equivalent would be arrays in Ruby), so it would be acceptable for Hash#map return an array (an alternative would be a forced conversion to make it more clear: hash.to_a.map { |k, v| ... } ). BTW, Ruby's implementation of Hash#fmap is dissimilar, I use it often, and I have included it in my general extension module:
class Hash def fmap(&block) Hash[self.map(&block)] end end {:a => 1, :b => 2}.fmap { |k, v| [k.to_s, v*2] } #=> {"a" => 2, "b" => 4}