I'm not sure why this was so excruciating for me, but I finally found out how to format the arrays for ajax. The way that arrays are urlencoded threw me.. I'm not sure that deep nesting is really supported universally. Here are the various versions of array data that ajax can take:
var associativeData = {'first_name' : 'John', 'last_name' : 'Smith', 'chosen_people' : Array('37', '42')};
var nameValueData = Array(
{'name' : 'first_name', 'value' : 'John'},
{'name' : 'last_name', 'value' : 'Smith'},
{'name' : 'chosen_people[0]', 'value' : 37},
{'name' : 'chosen_people[1]', 'value' : 42}
);
var serializedData = "first_name=John&last_name=Smith&chosen_people[]=37&chosen_people[]=42"
And here is what worked for me to append my own arrays. The if(values) line is optional but without it, the else case never fires so you don't get the chosen_people var at all on the server if nothing is selected:
var data = form.find('input').serializeArray();
var values = form.find('#chosen_people').val();
if(values)
for(var value in values)
data.push({'name' : 'chosen_people[' + value + ']', 'value' : values[value]});
else
data.push({'name' : 'chosen_people[]', 'value' : ''});
Just posting this answer in the hopes it helps someone.