You shouldn’t need to write a custom projection for this; projection.rotate seems to do the trick:
projection = d3.geoConicConformal()
.parallels([40, 68])
.rotate([-9.05, 0])
.scale(1690)
.translate([472, 2390])
As to projection.translate and projection.center, they work together to specify where a point in spherical coordinates: the (rotated) center in [longitude, latitude]) appears in the viewpoint at the translate position in [x, y]. So for example, ignoring rotation for a moment, if you wanted to position Bremen 53.0793° N, 8.8017° E at the middle of the viewport, you would say:
projection = d3.geoConicConformal()
.parallels([40, 68])
.center([8.8017, 53.0793])
.scale(1690)
.translate([width / 2, height / 2])
If you have a rotation, the center is in pre-rotation coordinates, so you have to make a little adjustment:
projection = d3.geoConicConformal()
.parallels([40, 68])
.rotate([-9.05, 0])
.center([8.8017 - 9.05, 53.0793])
.scale(1690)
.translate([width / 2, height / 2])
But often projections have a central meridian that is used both for the rotation and the center, which means that you typically end up with a center longitude of 0, and a center latitude half-way between the two standard parallels. You can then nudge the translate slightly to align your maps:
projection = d3.geoConicConformal()
.parallels([40, 68])
.rotate([-9.05, 0])
.center([0, 54])
.scale(1690)
.translate([width / 2 - 7, height / 2 + 4])
I probably have some code around somewhere to determine the translate, center and scale automatically from two points…