I've experimented with google cloud and have figured this out already.
Folder structure is as follows:

Now before you deploy declare an environment variable called "SERVICE_NAME: 'service-name-goes-here'" in your .yaml files.
When you deploy you run:
gcloud app deploy ./service-1.yaml ./service-2.yaml
In package.json you setup the start script to use the launcher.js file.
"scripts": {
"start": "cross-env NODE_PATH=. NODE_ENV=production node launcher.js"
}
Inside launcher.js you write some code like this:
const service = process.env.SERVICE_NAME;
console.log("Starting service: " + service);
switch (service) {
case 'service-1':
require('./service-1/main.js');
return;
case 'service-2':
require('./service-2/main.js');
return;
default:
console.error("Unrecognized SERVICE_NAME: " + service);
process.exit(1);}
Essentially what we have done is deployed ALL of the code for every service to the app engine, but the starting of the service is defined in launcher.js.
So the service that will start is based on what the .yaml has defined SERVICE_NAME as.
This has worked for me and I have 5+ services sharing common modules.