Just a suggestion, don't know if this will work, but you could have a look at arrange_if() and possibly write some predicate function that evaluates to TRUE if cc == 2.
You probably wouldn't want to use ifelse() for this. Notice the error if you run the "safe" version, if_else() from dplyr.
library(dplyr, warn.conflicts = FALSE)
my.df <- data.frame(aa=factor(c(1:24)),
bb=factor(rep(c(1:6), each=4)),
cc=factor(rep(c(1,2), each=4, times=3)),
dd=c(11:14, 21:24, 31:34, 41:44, 51:54, 61:64),
desired=c(11:14, 24:21, 31:34, 44:41, 51:54, 64:61))
my.df %>%
group_by(bb) %>%
mutate(ee=if_else(cc==2, sort(.$dd, decreasing = TRUE), dd))
#> Error: `true` must be length 4 (length of `condition`) or one, not 24
Created on 2018-12-31 by the reprex package (v0.2.1)