JavaScript / Express error handling w/ promises
There's a big problem here.  getUserByEmail() can either return a promise or throw synchronously which is a bad design and very unfriendly for the caller.  Instead, you want any synchronous errors to be returned as a rejected promise.

The beginning of your code should be changed from this:

// SERVICE / MODEL LOGIC
getUserByEmail() {
  if (!this._model.email) {
    throw new VError('Missing email.');
  }


to this:

// SERVICE / MODEL LOGIC
getUserByEmail() {
  if (!this._model.email) {
    return Promise.reject(new VError('Missing email.'));
  }


The other throw statements are what you do from a .then() handler to turn the promise chain into a rejected promise.  You could also do return Promise.reject(...), but throw works just as well.