Okay so I did some more digging and this is what I found:
If you choose a device on the corona simulator that matches the width and height set in your config.lua then display.save() will save the image back at full resolution. However, when you choose a device that has a different width and height, display.save() will save an image that is NOT full resolution. It seems to differ by the scale factor between the device resolution and what you set in your config.lua.
If you define your width and height in config.lua each to be 0, then corona will not use dynamic scaling for your content. This results in a huge mess on different device screen resolutions, but display.save() will work correctly every time regardless of device resolution.
So it seems corona dynamic scaling is interfering with the display.save() being able to save a display object at its full resolution when the width and height defined in config.lua is different than the device resolution.
How can I get around this? Is it a bug?