This can be achieved with some data manipulation after your summarize_all call, like this:
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tidyr)
mtcars %>%
select(mpg, hp, cyl) %>%
group_by(cyl) %>%
summarise_all(funs(mean, sd)) %>%
gather(key = key, value = value, -cyl) %>%
separate(key, into = c("type", "stat"), sep = "_") %>%
spread(key = stat, value = value) %>%
mutate(mean_w_sd = paste0(round(mean, 2), " (", intToUtf8("177"), round(sd, 2), ")")) %>%
select(cyl, type, mean_w_sd) %>%
spread(key = cyl, value = mean_w_sd)
#> # A tibble: 2 x 4
#> type `4` `6` `8`
#> <chr> <chr> <chr> <chr>
#> 1 hp 82.64 (±20.93) 122.29 (±24.26) 209.21 (±50.98)
#> 2 mpg 26.66 (±4.51) 19.74 (±1.45) 15.1 (±2.56)
Created on 2018-09-28 by the reprex package (v0.2.0).
Granted, it may not be the most elegant method but it gets what you wanted. You could do some minor things after this, like renaming columns, but this accomplishes what you are after.