While it is correct that a pure logarithmic function cannot code negative values, neither ACEScc nor ACEScct are pure log functions.
ACEScc can code linear values down to about -0.00003, although it uses negative ACEScc values to do so – ACEScc zero represents a positive value approximately 7.25 stops below mid grey. The linear portion of ACEScct means that it can code any negative value, and even the 0-1 ACEScct range includes linear negatives – ACEScct zero represents approximately linear -0.007.
In an unclamped float implementation, negatives should not be clamped by a transform to and from ACEScct.
The fact that a positive ACEScct value can represent a small negative excursion in linear is the reason that performing some operations in ACEScct can reduce the likelihood of the artefacts which can result from negative values.
*I was wrong when I originally said that ACEScc can code small negative values. While the ACEScc decoding function can produce values down to -0.00003, the encoding function explicitly clamps negative values. Without the clamp, the main ACEScc function would be able to encode small negative excursions in linear. It can encode zero, which a pure log function cannot do.