Well, I don't think there's an easy way to modify the y-axis labels in plots produced by qcc. As suggested by @Christiannolan, your best bet is to take the object produced by qcc, extract the relevant data from it, and then plot using ggplot. It's not the easiest thing to do, but if you're game to try, here's how I would approach it:
library(tidyverse)
library(qcc)
library(scales)
data("orangejuice")
u_chart_obj <- with(orangejuice, qcc(D, sizes = size, type = 'u'))
oj <- mutate(orangejuice,
row_id = 1:nrow(orangejuice),
# identify rows of interest
beyond_limits = row_id %in% u_chart_obj$violations$beyond.limits,
violating_runs = row_id %in% u_chart_obj$violations$violating.runs,
# data for plotting control limits
center = u_chart_obj$center,
lcl = u_chart_obj$limits[1, 'LCL'],
ucl = u_chart_obj$limits[1, 'UCL'])
update_geom_defaults('point', list(size = 3))
ggplot(oj, aes(sample, D/size)) +
# create a basic chart with dots and lines
geom_line(color = 'gray', size = 0.5) +
geom_point() +
# mark certain points red or gold
geom_point(color = 'red', data = filter(oj, beyond_limits)) +
geom_point(color = 'gold', data = filter(oj, violating_runs)) +
# add the control limits and center line
geom_hline(aes(yintercept = lcl), linetype = 'dashed') +
geom_hline(aes(yintercept = ucl), linetype = 'dashed') +
geom_hline(aes(yintercept = center)) +
# express y axis labels in 'per million'
scale_y_continuous(labels = unit_format(scale = 1e6, unit = '')) +
# misc cleanup
theme_light() +
labs(x = 'Sample Number', y = 'Defects per million units')