What are best practices around newsletter signup on contribution page, profiles and contact seeing their donation history?
You can do this by including a checksum link in your emails that returns the user to their contact dashboard and allow them to edit it.

You can also use a checksum link to a profile to let them update things. 

it'd be something like the following

http://mydomain.org/civicrm/user?reset=1&amp;cid={contact.contact_id}&amp;{contact.checksum}