There is no point whatsoever in tieing a hash like %foo to retain the order of its keys when it only has one key as in your example, which is "a". Likewise any subhashes which are untied will not retain the order of their keys. If you wish to retain the order all the way down for some reason then you need to tie all your hashes.
#!/usr/bin/env perl
# Subhash order maintained
use strict;
use warnings;
use Test::More tests => 3;
use Tie::IxHash;
tie my %a, 'Tie::IxHash';
tie my %b, 'Tie::IxHash';
tie my %x, 'Tie::IxHash';
my %foo;
$a{c} = [3, 2, 1];
%x = ( s => 'senatus', p => 'populus', q => 'que', r => 'romanus');
%b = ( x => \%x, y => "ravi" );
$a{b} = \%b;
$foo{a} = \%a;
is_deeply ([keys %{$foo{a}}], [qw/c b/], '1st level order re
+tained');
is_deeply ([keys %{$foo{a}{b}}], [qw/x y/], '2nd level order re
+tained');
is_deeply ([keys %{$foo{a}{b}{x}}], [qw/s p q r/], '3rd level order re
+tained');
This all still very much sounds like an XY Problem, however.