Don't use apply
create a vector of expressions.
Instead use parse(text = ...)
.
.expressions <- paste(colnames(data),greek,sep="")
legend_expressions <-parse(text = .expressions)
matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

If you want to include ~
within the expressions. Given your current workflow, it would seem easiest to replace sep = ''
with sep = '~'
within the call to paste
.expressions <- paste(colnames(data),greek,sep="~")
legend_expressions <-parse(text = .expressions)
matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)

It might even be clearer to use sprintf
to form the character strings which will become your expression vector.
If you want to include character strings that include spaces, you will need to wrap these strings in quotation marks within the string. For example.
greek <- c("alpha", "beta", "gamma", "delta")
other_stuff <- c('hello world','again this','and again','hello')
.expressions <- mapply(sprintf, colnames(data), other_stuff, greek,
MoreArgs = list(fmt = '"%s %s"~(%s)'))
.expressions
## A B C D
## "\"A hello world\"~(alpha)" "\"B again this\"~(beta)" "\"C and again\"~(gamma)" "\"D hello\"~(delta)"
legend_expressions <-parse(text = .expressions)
matplot(data)
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions)
