It makes sense to healthcheck a single server to allow for a 'circuit breaker' scenario. Imagine your backend is accepting TCP connections but is unable to generate a response. Client apps connecting through this haproxy will have to wait until their built-in timeout occurs to close the connection. If they are usually expecting a 50ms response time, and now have to wait 3s for their request-timeout to expire, they are most likely going to fail.
A very well written client app will detect this situation and perform their own circuit breaking, but in my experience most apps do not. Adding the healthcheck to HAProxy lets HAProxy circuit-break on their behalf.
So, the backend is unable to generate a response and causes the healthcheck to fail. HAProxy then immediately responds to any incoming requests with a well-formed 503, and the client app can then deal with that however it likes.
Much of the time applications are written assuming that backends quickly reply with a success or failure. Having HAProxy do the health checks mitigates some of the scenarios where the application doesn't handle a non-response.