Use nested composite literals to initialize a value in a single expression:
child := Child{Base: Base{ID: id}, a: a, b: b}
Go issue 9859 proposes a change to make composite literals consistent with field access for embedded types. This change will allow the Child{ ID: id, a: a, b: b } expression from the question.
Embedded types do not provide encapsulation in the sense that the feature does not restrict direct access the embedded type. An application can directly access child.Base.ID in addition to using child.ID.