It's better to write functions which take character values for choosing columns. In this case, your function can be rewritten as:
mf <- function(data, y){
  output <- data[, boxplot.stats(get(y))['out'], by = .(location)]
  setnames(output, 'out', y)
  return(output)
}
By using [ to subset the output of boxplot.stats, a named list with one element ('out') is returned. So output will have two columns: location and out.  Then you just need to change out to be whatever was given for y.
Example:
set.seed(100)
data1 <- data.table(
  location = state.name,
  hours    = rpois(1000, 12)
)
mf(data = data1, y = 'hours')
#           location hours
#  1:       Delaware    25
#  2:        Georgia    21
#  3:          Idaho     4
#  4:  Massachusetts     5
#  5:       Missouri     7
#  6: South Carolina     5
#  7: South Carolina     6
#  8:   South Dakota    20
#  9:          Texas     5
# 10:           Utah    22
Non-standard evaluation is tricky and only worth the effort if you can get something out of it. data.table uses it for optimization behind the scenes. tidyverse packages use it to allow in-database processing. If there's no benefit (besides not having to type a few quotation marks), there's only a cost.