Not exactly using facet, but here another option of using the patchwork
package, which gives you a very neat control of your plot panels.
Of course, this repeats all axes titles and labels, so that's probably not quite ideal. But an option.
library(tidyverse)
library(patchwork)
foo <- data.frame(x = rnorm(210), y = rnorm(210), z = letters[1:7])
list_plots <- map(.x = foo %>% group_split(z), .f = ~ ggplot(foo, aes(x = x, y = y)) +
geom_point())
layout_p <- '
##A
BCD
EFG
'
wrap_plots(list_plots, design = layout_p)

Created on 2020-02-05 by the reprex package (v0.3.0)
A more programmatic approach would be to only need to set the number of rows, here in this example nrow = 2
nrow <- 2
# how many actual panels
n_panel <- length(unique(foo$z))
# calculate numbers of columns
ncol <- ifelse(n_panel %% nrow == 0, n_panel %/% nrow, n_panel %/% nrow+1)
# calculate number of leading empty panels
n_lead <- nrow*ncol - n_panel
# letters for the design argument in wrap_plots
plot_letters <- LETTERS[seq_along(unique(foo$z))]
# make a vector which can be cut into pieces of ncol length
x <- paste(c(rep('#',n_lead), plot_letters), collapse = '')
# cut into ncol pieces and add linebreaks
layout_l <- paste0('\n', substring(x, seq(1, nchar(x), ncol), seq(ncol, nchar(x), ncol)), collapse = '')
wrap_plots(list_plots, design = layout_l)

Created on 2020-02-05 by the reprex package (v0.3.0)