I'd just split the column. If you want numeric order for the numbers part of the ID, you should probably have these numbers as a numeric column anyway.
ab$a1 <- as.numeric(gsub("[[:alpha:]+]", "", ab$a))
ab$a2 <- gsub("\\d+", "", ab$a)
ab[order(ab$a1, ab$a2),]
# a b a1 a2
#1 1A 1 1 A
#4 2B 4 2 B
#5 2C 5 2 C
#7 3A 7 3 A
#8 3B 8 3 B
#2 10A 2 10 A
#3 11A 3 11 A
#6 22C 6 22 C