Its not like that. It will definitely change the value. you might not be getting value in field3 because the record you are fetching will not have value of field3. and answer to your question is IT WORKS. Try this,
def onchange_partner(self, cr, uid, ids, partner_id, context=None):
res = {}
if partner_id:
obj = self.pool.get('res.partner').browse(cr, uid, partner_id)
res['field1'] = obj.field1
res['field2'] = obj.field2
res['field3'] = 'Hello' # this field type must be char or if not then give
#value accordingly, its just to prove you that values are filled on onchange.
return {'value': res}
Hope this will help you.