The Fama-French factors follow from simple sorting
procedures, so they do not explicitly control
correlation. But if you have access to the underlying
stocks, you could replace this sorting procedure by an
optimisation model that looks for a portfolio similar
to the traditional Fama-French sort portfolio, but with a
constraint on correlation between this portfolio and
others (see e.g. this example )
An alternative idea would be take the time-series of
the factor portfolios and correct their exposure. For
instance, suppose you have two factors value and
momentum. Here is a bit of R code to give some intuition.
I use random numbers for the factors.
value <- rnorm(50)
momentum <- rnorm(50)
##  0.1828126
So, the factors are correlated. Regressing one on the
other then will give a non-zero slope.
model <- lm(value ~ momentum)
## (Intercept) momentum
## -0.301 0.153
But then, building a portfolio long value minus this
slope times momentum will result in a value portfolio
that is not correlated to momentum any more.
round(cor(value - coef(model)["momentum"]*momentum, momentum), 8)
this helps depends on your application and the degree
of correlation. Some plots.
plot(value, value - coef(model)["momentum"]*momentum,
xlab = "value", ylab = "value 'minus' momentum")
plot(value - coef(model)["momentum"]*momentum, momentum,
xlab = "value 'minus' momentum", ylab = "momentum")