RingCT is only mandatory IF it can be used. It cannot be used if there are not enough outputs on the chain to build a ring for the output to be spent, and since all outputs in a ring must have the same amount (either a known amount from pre-RingCT times, or the placeholder 0 for RingCT outputs), it follows that old "dust" outputs will often have unique amounts such as 0.000000065874, with no other outputs with this amount on the chain (or not enough of them). RingCT therefore cannot be used for those ouputs, but we do not want them to become unspendable, so a pre-ringct tx is allowed in that case. Such txes cannot generate more of those odd amount outputs though, so this is not self perpetuating.