Send your second request (for the flight no.) when the first request is done. Since getJSON() returns a jqXHR object you can use its method .done() which fires as soon as the request completes successfully. With method chaining your code may look like this:
$(function(){
$("select#fromICO").change(function(){
$.getJSON("/trip_reports_chain.php",{from: $('#fromICO').val(), t: 'd'}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
}
$("select#toICO").html(options);
})
.done(function(){
$.getJSON("/trip_reports_chain.php",{to: $('#toICO').val(), t: 'f', from: $('#fromICO').val()}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
}
$("select#flightNo").html(options);
});
});
})
$("select#toICO").change(function(){
$.getJSON("/trip_reports_chain.php",{to: $(this).val(), t: 'f', from: $('#fromICO').val()}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
}
$("select#flightNo").html(options);
})
})
})