This is intended. If "casein" also had a dummy column, it would be a linear combination of the other columns (if it's not NA or one of the other levels, it has to be "casein"). This is often the most useful form, so it's what the function returns. If you need to add the column, it shouldn't be hard.
mm <- model.matrix(~ feed, data = chickwts)
mm <- cbind(mm, feedcasein = rowSums(mm[, -1]) == 0)
head(mm)
# (Intercept) feedhorsebean feedlinseed feedmeatmeal feedsoybean feedsunflower feedcasein
# 1 1 1 0 0 0 0 0
# 2 1 1 0 0 0 0 0
# 3 1 1 0 0 0 0 0
# 4 1 1 0 0 0 0 0
# 5 1 1 0 0 0 0 0
# 6 1 1 0 0 0 0 0
It looks like the correct order to me.
> levels(chickwts[["feed"]])
# [1] "casein" "horsebean" "linseed" "meatmeal" "soybean" "sunflower"