From a google maps standpoint - its pretty simple. Its already built to let you send it multiple destinations in a chain - so you would do something like
https://www.google.com/maps/dir/Denver,+CO/Boulder,+CO/Fort+Collins,+CO/Colorado+Springs,+COWhere you're going from Denver -> Boulder -> Fort Collins -> Colorado Springs. You just sort your addresses in the order you want to travel and do like this:
"
https://www.google.com/maps/dir/" & [Address 1] & "/" & [Address 2] & "/" [Address 3] .... (rinse and repeat)
Now the catch is I don't know if there is a limit to how many destinations google can accept, so I can only truly speak for Quick Base and what you can try and send it.
I'm going to assume that your comment about ALL of the related contact addresses means that if the campaign has 20 contacts you want to chain all 20 child contacts together and run the route.
Option A, depending on your coding ability, would be to do a API_DoQuery when the button is clicked, use Javascript to pull the address field from each record and use those address strings to build a custom URL. If you want to go that route I can provide more info.
Option B - which wasn't possible as of last week until the Dec/2018 release, is to use the new Summary List Text feature that combines text fields from your child records into your master record.
This starts to get a little hairy so bear with me, but I went and played around to be 98% confident this will work. So shoutout to your timing and a great new feature
Step 1 - Set up a formula-text field in your Contacts Table and use ToText() to convert your address to plain text => ToText([Contact Address])
Step 2 - In your relationship between your campaign and contacts, summarize your new text field from (1) to create a new combined text field that will display all the addresses you want
Step 3 - Because of the way Quick Base generates this field - you'll need to split your new field back into its components using a Part() function.
So like this => Part(ToText([Your new combined address field]),1,";")
Will pull the first address in the list.
Step 4 - Since we're summarizing this into your campaign, you'll want your formula-url button to map the route to be in the 'Campaigns' table where you have your combined text summary field as well. In that button - you'll still follow the google structure of
"
https://www.google.com/maps/dir/", but now we're concatenating each chunk / part from the list. So it'll look more like this
"
https://www.google.com/maps/dir/" &
Part(ToText([Your new combined address field]),1,";") & "/" &
Part(ToText([Your new combined address field]),2,";") & "/" &
Part(ToText([Your new combined address field]),3,";") & "/" &
Part(ToText([Your new combined address field]),4,";") & "/" &
Part(ToText([Your new combined address field]),5,";") & "/" &
Part(ToText([Your new combined address field]),6,";") & "/" &
Part(ToText([Your new combined address field]),7,";") & "/" &
... on and on
There is the catch that this isn't 'fully' dynamic, if you want that you'll need to revert to Option A and have to query and do a forEach / for loop to account for any number from 1-100 addresses
But you could theoretically copy and paste that part() formula above and just copy it 100 times and just change the numbers to match.