I think it's a little difficult to make an exact discrete cutoff point in a continuous color scale using scale_fill_gradientn . A quick alternative is to use scale_fill_gradient , set the clipping using limits and set the color of the values to “outside the limits” using na.value .
Here is a slightly simpler example than in your question:
# some data df <- data.frame(x = factor(1:10), y = 1, z = 1:10) # a cutoff point lo <- 4 ggplot(df, aes(x = x, y = y, fill = z)) + geom_bar(stat = "identity") + scale_fill_gradient(low = "yellow", high = "green", limits = c(lo, max(df$z)), na.value = "red")

As you can see, values below the cut-out point will not be displayed in the legend, but you might think that in any case you can add a big chunk of the red waste of the “bandwidth of the legends”. Instead, you can simply add a verbal description of the red bars in the title of the picture.
You can also distinguish between values below the low point and above the high point. For example, set the values “too low” to blue and “too high” to red. Here I use findInterval to distinguish between low, medium and high values.
# some data set.seed(2) df <- data.frame(x = factor(1:10), y = 1, z = sample(1:10)) # lower and upper limits lo <- 3 hi <- 8 # create a grouping variable based on the the break points df$grp <- findInterval(df$z, c(lo, hi), rightmost.closed = TRUE) ggplot(df, aes(x = x, y = y, fill = z)) + geom_bar(stat = "identity") + scale_fill_gradient(low = "yellow", high = "green", limits = c(lo, hi), na.value = "red") + geom_bar(data = df[df$grp == 0, ], fill = "blue", stat = "identity")
