The Error constructor accepts a string, NOT an object.  When you pass it an object, it then tries to use it as a string and you get [object Object] as the automatic string conversion associated with a plain object.
You can do this instead:
app.use((req, res, next) => {
    const e = new Error('Not Found');
    e.statusCode = 404;
    throw e;
});
Or, I find it easier to create my own little Error subclass that has the desired arguments for the constructor:
class MyError extends Error {
    constructor(msg, status) {
        super(msg);
        this.status = status;
    }
    toJSON() {
        // handle the fact that the message property is not
        // enumerable and won't be picked up by JSON.stringify()
        // on its own
        return JSON.stringify({message: this.message, status: this.status});
    }
}
app.use((req, res, next) => {
    throw new MyError('Not Found', 404);
});
Note: If you're trying to serialize an Error object to JSON, some of the properties of an Error object are non-enumerable which means they won't show up in a default JSON.stringify().  You can override/control that by providing a .toJSON() method on your custom Error class as shown here or only use enumerable properties on the object.