@kikon's answer is correct: This doesn't work with scales.x.bounds: 'data', but it works when I explicitly set scales.x.min and scales.x.max and use scales.x.ticks.includeBounds: false.
scales.x.bounds: 'data'
scales.x.min
scales.x.max
scales.x.ticks.includeBounds: false