When you have a callback, you almost always want it in the form:
for<'a> FnMut(&'a Room)
otherwise it means the parameter for the function needs to exist and be valid for way longer than the function, and had to be created even before search was called, and outlive that whole outer call.
When a function gets a reference with 'house it doesn't matter that itself is dropped. The element has been given to the function for the whole 'house lifetime, so the function is allowed to keep it beyond its own lifetime (e.g. store it in a shared/global container also bound by 'house).
Anyway, "almost always" is too strong; this case is a valuable exception to that rule. Here, I think using for<'a> FnMut(&'a) would make both search functions impossible to use successfully.
The idea is: The closure is short-lived. It creates iterators that can live as long as the underlying data ('house).
In general this is correct (and the bound can just be written as F: FnMut(&Room), which implicitly inserts the HRTB), but it's not sufficient to solve the issue here: playground.
I think the problem is that the compiler thinks of the return type of search_fallible as an opaque type that has all the generics of search_fallible, that is, <'house, F, Iter, Err>, and requiring this type to be : 'house requires F: 'house.
This version uses the nightly-only type-alias-impl-trait feature to remove F from the generics of the return type, and it compiles. I'm not sure if there is a good workaround for this on stable, other than just not using impl Trait and naming the type like so.