The recommended approach for translating a vector tile layer seems to be to translate the canvas context on precompose (see OpenLayers 3: per-layer translation for tiled image layers). As noted, only those tiles that fall within the map’s pre-translation visible extent are rendered.
How can I achieve the effect of translation without losing those boundary tiles?
I also tried using a custom tile grid with an origin (https://github.com/openlayers/openlayers/issues/9514) but this appears to be a misuse of the ‘origin’ parameter so tiles were only partially drawn. I am guessing that custom origins are required to fall on a tile boundary; mine do not.
Update: Mike’s solution is correct. As I recall, I had tried Mike’s approach before submitting this question and, although the layer was translated, there was a problem with portions of tiles disappearing (or being drawn in the wrong location). But experimenting with Mike’s example, I noticed that setting useInterimTilesOnError to false in my application fixed both the disappearing and misdrawn tile issue. Perhaps there is some problem with the tiles I am using, but it is interesting that when the layer is not offset, tiles are rendered properly regardless of how useInterimTilesOnError is set.