Frequency Domain Equivalent to Zero-Phase Filtering (`filtfilt`)
In essence filtfilt does the the following
$$y[n] = x[n] \ast h[n] \ast h[-n]$$
It's convolution with the impulse response and then the time reversed impulse response (in any order since the convolution is commutative).
So in the frequency domain it's simply
$$Y(z) = X(z) \cdot H(z) \cdot H'(z) = X(z) \cdot |H(z)|^2 $$
which obviously is zero-phase since $|H(z)|$ is real.
For an FIR filter that's easy enough: If your filter length is $N$, the cascade length is $2*N-1$ and your FFT length needs to be at least $4N-3$. Take your impulse response, zero pad it to the FFT size, take the magnitude squared and then mutliply with $e^{-j2\pi n/N} $ to get it circulated to the proper time location. Then proceed as with any other overlap add.
Alternatively you can just calculate the aggregate impules respones as
$$ h_{agg}[n] = h[n] \ast h[-n] $$
IIR filters can be done using the same approach but it requires turning the IIR into an FIR by suitable truncation of the impulse response. filtfilt() does that implicitly as well but uses the length of the signal as the truncation length.