I may have figured out my issue:
// 1. slowest based on average time of several runs with cache cleared
before each
const table = await Table.from(fetch('/table.ipc'));
// 2. 5-10% faster than 1
const table = await Table.from(fetch('/table.ftr'));
// 3. 10-15% faster than 2, presumably because table construction starts
before fetch completes
const reader = await AsyncRecordBatchStreamReader.from(fetch('/table.ipc'));
const table = await Table.from(reader);
