No approximation here. The formula for $L^{CPI}$ can be directly derived from the formula for $L^{PG}$.
\begin{align}
\nabla L^{PG} &= \mathbb{E}_{a_t, s_t \sim \pi_\theta} \Big[ \nabla \log \pi_\theta(a_t | s_t) A_t \Big] \\
&= \int_{a, s} \pi_\theta(a | s) \nabla \log \pi_\theta(a|s) A_t \\
&= \int_{a, s} \frac{\pi_{\theta_{old}}(a | s)}{\pi_{\theta_{old}}(a | s)} \pi_\theta(a | s) \frac{\nabla \pi_\theta(a | s)}{\pi_\theta(a | s)} A_t \\
&= \mathbb{E}_{a_t, s_t \sim \pi_{\theta_{old}}} \Big[ \frac{\nabla \pi_\theta(a_s | s_t)}{\pi_{\theta_{old}} (a_t | s_t)} A_t \Big] \\
&= \nabla L^{CPI}
\end{align}
Now:
\begin{align}
L^{PG} &= \int \nabla L^{PG} = \mathbb{E}_{a_t, s_t \sim \pi_\theta} \Big[ \log \pi_\theta(a_t | s_t) A_t \Big] \\
L^{CPI} &= \int \nabla L^{CPI} = \mathbb{E}_{a_t, s_t \sim \pi_{\theta_{old}}} \Big[ \frac{\pi_\theta(a_s | s_t)}{\pi_{\theta_{old}} (a_t | s_t)} A_t \Big]
\end{align}
The difference between the two is that in $L^{PG}$ states and actions are sampled using the original policy $\pi_\theta$. This means that once you perform one gradient update step you have to throw away the data and collect new.
In $L^{CPI}$ the states and actions are collected under $\pi_{\theta_{old}}$, which means that you can perform multiple updates with the same dataset. Obviously, if you perform only one update step with PPO you will get the vanilla PG. After the first update step the two objectives will differ.
There is a bit more theory regarding why you want to clip, but since this is not part of the question I will just refer you to this blog post that I wrote:
https://pi-tau.github.io/posts/actor-critic/#ppo