You’re correct in that the issue is that this is a system user, which confuses passwd. I think a workaround (though albeit very ugly) would be to grab the line from /usr/lib/passwd that adds the haproxy user, and append that to /etc/passwd manually. NSS should search /etc/passwd before /usr/lib/passwd, so this would allow passwd to change the password, and for system applications to see the overriden user rather than the system one.