You say that the damage system spawns some particle effects and sound. This should be avoided, as you are now no longer SOLID (damage system should only take responsibility of damages, not graphical effects and sound).
The damage effect system wouldn't literally spawn anything, it would just set a flag indicating the nature of the effect and a particle system, er, system would come along and do the actual particle spawning.
Components having logic vs systems having logic:
Isn't it the same thing? Take a component with logic, make all the functions static, add an ID parameter, and move the data into a struct.
Then the entity becomes either a container of structs, or if the systems hold the data, just an ID. You still use it the same way, passing messages with a target entity which modify the component data and spawn other messages or interact with lower-level systems that do the heavy lifting. You can't do everything by setting flags and waiting for the update, that sounds like a nightmare.
Components having logic forces you to choose a single component in which to put every piece of logic. If there's logic that needs to interact with data from several components, or with multiple object instances, where is the best place to put that logic? In my experience with traditional "component" systems, it's just stuffed into whichever component makes the most sense to that particular developer at that particular point in time. Part of the problem is that as OO programmers we've been trained to always stuff our logic and data together, but that only makes sense when the logic can be completely localized to a particular object, otherwise it's no longer self-contained and is no longer an independent "object". To me, the ECS pattern strives to make the distinction between logic and the data it acts on much more explicit. As a result of this looser coupling, its very easy to modify or extend both.
And you most certainly can do quite a bit with setting 'flags' and waiting for 'updates'. That's basically how any relational database programming works ;)






