I think it's simply that pre C++11, algorithms were generally recommended over plain for-loops for most things. In theory, it's easier to understand the purpose of the code, as you don't have to understand the whole loop implementation first. for_each is perhaps an extreme though, since its for-loop implementation would be the simplest.
Before lambda functions, 'boost::bind' was simply a requirement if you wanted to use the algorithm without defining a custom functor.
Nowadays, with range-based for loops, you'd just do this:
for (auto& participant : participants)
participant->deliver(msg);
Algorithms are still better for more complicated loops though (especially now you don't have to use 'boost::bind').