If you use PWM for the upper range, you will always have problems with the PWM noise. Remember that you are shooting for a resolution 10 bits (1000 times) better than a single step of your (upper) 10-bit PWM signal. A better idea is a 'real' DAC for the upper x bits and PWM for the lower x bits. Then the residual PWM noise will be down hopefully well below the least significant (20th) bit. The real DAC can be a simple one, just 12 or 14 bits. Make sure it is monotonic and you probably want to use an external reference (or use one with a really good stable internal reference and a ref out pin).
Speaking of the reference, I get the impression that you are just using the 3.3 V supply of the PIC as the reference (filtered PWM output is some % of the supply). This is fine to begin with when playing with code, but when you are serious about making a stable accurate DAC, you will need to use a real, stable reference, and use the PWM signal to switch that reference.
In your first schematic, don't forget that you need to scale the LSB DAC output down by a factor of 1000 or so. You also need some overlap so that you can set and forget the MSB DAC, and adjust only with the LSB one, so for 20 bits of resolution, you probably want two 12 bits DACs giving 4 bits of overlap, or a 14 bit DAC for MSB and 10 bit (PWM one) for LSB. You need that overlap.
Don't forget that the PWM signal will be controlled according to feedback received from an ADC measuring the overall output, so you can't make the RC time constant of the PWM filter too long, or the control loop will need to be made to be horribly slow. You don't want to have to wait several minutes for the final value to settle, and you also need to be able to respond to variations that will be caused by small temperature changes, drafts, etc.
This is not impossible but you are far from it. Fluke used PWM techniques to get down to ppm accuracy in the 5440A/5440B and other calibrators.