Why does entity_metadata_wrapper does not preserve node's custom URL while updating other fields?
In case someone else face the same issue, I come across the following


  Pathauto uses the following logic (listed by priority) to determine if
  the Pathauto checkbox should be checked when editing a node:
  
  If the node is a new node, it defaults to having an automatic alias.
  If the node is not a new node: If the node does not currently have an
  alias, it assumes that the node was manually un-aliased, so it will
  default to not have an automatic alias. If the node's current alias
  matches the alias that Pathauto would generate based on the pattern,
  then it will default to checked. Otherwise, the checkbox will default
  to be unchecked. If you are using the Pathauto persistent state
  module, then once you save a node, the checkbox will remain checked or
  unchecked regardless of the logic above until you check or uncheck it
  later.
  
  If you have content you've created before installing Pathauto that you
  would like to ensure that the checkbox is checked whenever you edit
  them, then you should use the 'Update URL alias' bulk action on your
  content listing admin page (admin/content/node).
  
  If you are saving changes to nodes automatically using node_save, you
  need to specify $node->path['pathauto'] = FALSE; in Drupal 7 or
  $node->pathauto_perform_alias = FALSE; in Drupal 6 (see
  http://drupal.org/node/1179988) in order to stop pathauto overwriting
  any custom paths you might already have for the node.


In Drupal 6 

$node-&gt;path['pathauto'] = FALSE;


in Drupal 7 

$node-&gt;pathauto_perform_alias = FALSE;