As already mentioned in my comment, there is a regression caused by #403 which prevents the exit code from being set in time, which causes the process not to fail in case the coverage threshold is not met.
I've created a small example to show-case the current behavior and also did some PoC on how it might be solved:
https://github.com/matz3/issue-karma-coverage-threshold-exit-code
Here are the changes to karma and karma-coverage
With v2.0.1 everything seems to work fine.