Right you are. I'm actually surprised by this. I thought it would work with a data.frame (or else coerce the data.frame to tibble) but here's what I found:
library(tidyverse)
df <- tibble(c1 = letters[1:5], c2 = 5:9, c3 = LETTERS[5:9])
df %>% mutate_if(is.character, str_replace_all, pattern = '[aeiouAEIOU]', replacement = '%%%%')
#> # A tibble: 5 x 3
#> c1 c2 c3
#> <chr> <int> <chr>
#> 1 %%%% 5 %%%%
#> 2 b 6 F
#> 3 c 7 G
#> 4 d 8 H
#> 5 %%%% 9 %%%%
df2 <- data.frame(c1 = letters[1:5], c2 = 5:9, c3 = LETTERS[5:9])
df2 %>% mutate_if(is.character, str_replace_all, pattern = '[aeiouAEIOU]', replacement = '%%%%')
#> c1 c2 c3
#> 1 a 5 E
#> 2 b 6 F
#> 3 c 7 G
#> 4 d 8 H
#> 5 e 9 I