Сделайте свою preview
переменную состояния массивом вместо одного значения и установите для каждого элемента предварительный просмотр соответствующего индекса.
Это, вероятно, не оптимальная реализация, но это минимальная модификация вашего кода для иллюстрации идеи:
const [preview, setPreview] = useState([]); // empty array initially
for (var i = 0; i < files.length; i++) {
var file = files[i];
reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = event => {
// update the array instead of replacing the entire value of preview
preview[i] = event.target.result;
setPreview([...preview]); // spread into a new array to trigger rerender
}
}