I've seen a few different help threads on storing a Box<Pin<...>> closure on a struct and I have a solution which works, however I'd like to make it work in no_std environments which is not something I've come across. no_std naturally means I lose the ability to have Box. Here's my code that works only in std environments which is a pretty standard affair:
There currently isn't a good answer for translating this to no_std. You're essentially running into the same problems as why we don't have async trait yet, and the solutions are essentially the same as they are for async traits. However, none of them are easy to implement, especially not on stable Rust.
As an aside, there are several things in your code snippet that are unnecessary:
Closures are not self-referential, so the Pin around the Box<dyn Fn> is unnecessary.
The Sync trait is pretty much always redundant on a future.
As for your question about why you need + Sync on the closure, well, you don't need it and your code will work if you do this:
let future = (collection.foo)(item);
It doesn't work in your code because calling the closure creates a temporary immutable reference to the closure, and temporaries always exist until the end of the expression, which is after the .await in this case. Thus, you're keeping an immutable reference alive until after the .await. Immutable references are Send only if the type itself is Sync.