pm-update fails "sh: --backend=2: command not found"
This is happening because Drush is trying to find the local Drush executable via $drush = realpath($_SERVER['argv']['0']);.  In this context, realpath is returning FALSE, because $_SERVER['argv']['0'] does not exist.

As a workaround for this particular problem (which is that pm-update cannot call updatedb), you could run drush pm-updatecode followed by drush updatedb.

Note

If you work around the problem instead of solving it, you will also run into this same issue with other commands, such as sql-sync.