filter doesn't need to take ownership of items, it just needs to take a predicate. If filter took its item by value, you couldn't compose it with any other iterator method, because all items would be dropped (since it has no way to return an owned argument).
filter_map takes argument by value for the same reason map does: you want to transform your items in some way and pass them on. It is used to merge .filter(..).map(..) chain into a single call. Even if you don't want to modify the item itself, you can just easily pass it forward in the return value.