There is a solution using Google Apps Scripts.
Neat video explaining all the mechanisms involved:
Basically, by editing any cell on which your drop-down depends (e.g. Country for City list), for the related "City" cell it will automatically recalculate the range for validation data (list of possible Cities).
Copy/pasting the script here just in case it becomes unavailable (that example used makes & models of cars for dependent drop-downs):
function onEdit() {
var tabLists = "lists";
var tabValidation = "Main";
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
var activeCell = ss.getActiveCell();
if (activeCell.getColumn() == 1 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){
activeCell.offset(0, 1).clearContent().clearDataValidations();
var makes = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;
if (makeIndex != 0){
var validationRange = datass.getRange(3, makeIndex, datass.getLastRow());
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
activeCell.offset(0, 1).setDataValidation(validationRule);
}
}
}