Yes, there is. Define a context-free expression to be a term generated
by the following grammar:
$$
\begin{array}{lcll}
g & ::= & \epsilon & \mbox{Empty string}\\
& | & c & \mbox{Character $c$ in alphabet $\Sigma$} \\
& | & g \cdot g & \mbox{Concatenation} \\
& | & \bot & \mbox{Failing pattern} \\
& | & g \vee g & \mbox{Disjunction}\\
& | & \mu \alpha.\; g & \mbox{Recursive grammar expression} \\
& | & \alpha & \mbox{Variable expression}
\end{array}
$$
This is all of the constructors for regular languages except Kleene
star, which is replaced by a general fixed-point operator $\mu
\alpha.\;g$, and a variable reference mechanism. (The Kleene star is
not needed, since it can be defined as $g\ast \triangleq \mu
\alpha.\;\epsilon \vee g\cdot\alpha$.)
The interpretation of a context-free expression requires accounting
for the interpretation of free variables. So define an environment
$\rho$ to be a map from variables to languages (i.e., subsets of
$\Sigma^*$), and let $[\rho|\alpha:L]$ be the function that behaves
like $\rho$ on all inputs except $\alpha$, and which returns the
language $L$ for $\alpha$.
Now, define the interpretation of a context-free expression as follows:
$$
\newcommand{\interp}[2]{[\![{#1}]\!]\;{#2}}
\newcommand{\setof}[1]{\left\{#1\right\}}
\newcommand{\comprehend}[2]{\setof{{#1}\;\mid|\;{#2}}}
\begin{array}{lcl}
\interp{\epsilon}{\rho} & = & \setof{\epsilon} \\
\interp{c}{\rho} & = & \setof{c} \\
\interp{g_1\cdot g_2}{\rho} & = & \comprehend{w_1 \cdot w_2}{w_1 \in \interp{g_1}{\rho} \land w_2 \in \interp{g_2}{\rho}} \\
\interp{\bot}{\rho} & = & \emptyset \\
\interp{g_1 \vee g_2}{\rho} & = & \interp{g_1}{\rho} \cup \interp{g_2}{\rho} \\
\interp{\alpha}{\rho} & = & \rho(\alpha) \\
\interp{\mu \alpha.\; g}{\rho} & = & \bigcup_{n \in \mathbb{N}} L_n \\
\mbox{where} & & \\
L_0 & = & \emptyset \\
L_{n+1} & = & L_n \cup \interp{g}{[\rho|\alpha:L_n]}
\end{array}
$$
Using the Knaster-Tarski theorem, it's easy to see that the
interpretation of $\mu \alpha.g$ is the least fixed of the expression.
It's straightforward (albeit not entirely trivial) to show that you
can give a context-free expression deriving the same language as any
context-free grammar, and vice-versa. The non-triviality arises from
the fact that context-free expressions have nested fixed points, and
context-free grammars give you a single fixed point over a tuple. This
requires the use of Bekic's lemma, which says precisely that a nested
fixed points can be converted to a single fixed point over a product (and
vice-versa). But that's the only subtlety.
EDIT: No, I don't know a standard reference for this: I worked it out
for my own interest. However, it's an obvious enough construction that
I'm confident it's been invented before. Some casual Googling reveals
Joost Winter, Marcello Bonsangue and Jan Rutten's recent paper
Context-Free Languages, Coalgebraically, where they give a variant
of this definition (requiring all fixed points to be guarded) which
they also call context-free expressions.