After some fiddling around (with the inputs from @kristof bal) I understood that the filters dont quite work with the finite difference mode of GPAW. It works perfectly with the PAW mode (given by mode=PW(cutoff)). I've attached a script below for future reference:
from ase.io import read
from ase.constraints import ExpCellFilter
from gpaw import GPAW, PW
from ase.optimize import BFGS
molecule_file = 'BaTiO3.cif'
molecule = read(molecule_file)
molecule.calc = GPAW(mode=PW(200),nbands=30,xc='PBE',gpts=(24, 24, 24))
box = ExpCellFilter(molecule)
dyn = BFGS(box)
dyn.run(fmax=0.005)