This is one of the biggest problem with component systems, how the components communicate when they don't know about each other.
This problem is often resolved with an internal message system. Unfortunately it does not work well for all cases.
A solution for the health problem, can be that all objects that wants collision information sends a reference to a collision data structure, which is part of the entity, to the physic system.
Then the physic system, fill collision data for entities with collision data.
Now you can just check this collision information in each update, and call the sound and health system.
The problem with this solution, is that some entities may want more information about the collision than others, so unused information may be stored.
Hence, this breaks the idea of component based design.
Another solution is to make a query based physic system. Where entities can query for collision information. You can then solve the problem with unused information by creating different types of queries. The query system can also be used for ray tracing etc.
Both solutions require update functions, so if you want a very strict implementation of ECS these solutions is not appropriate.

Find content
Not Telling
