I was able to completely avoid the limitation by eliminating instances of query, and instead putting my "iter()" methods directly on the type.
pub trait Query<S: Storage> {
type Result<'r>: 'r where S: 'r;
fn iter(storage: &S) -> Option<impl Iterator<Item = (Entity, Option<Self::Result<'_>>)>>;
fn iter_chunks(storage: &S, chunk_size: usize) -> Option<impl Iterator<Item = impl Iterator<Item = (Entity, Option<Self::Result<'_>>)>>>;
}