Thanks for the reply. It sounds like I should switch web servers, but it doesn't solve my SD.h reliability problem. I should have made clear in the first post that the reliability issue appears with or without the web server.
I have a version where I stripped out the web server, sensor readings, setting of relays, and other functions until there was just the SD, a real time clock, and the TFT display (sold by Adafruit).
It takes me down to just these includes
#include <esp_task_wdt.h>
#include <Adafruit_ILI9341.h>
#include <SD.h>
#include <RTClib.h>
SD is from Arduino15\packages\arduino\hardware\esp32\2.0.13\libraries\SD, so it should be the core version.
It is this code where I fairly easily switched to SdFat and the problems went away.
Last night I built a version of ESPAsyncWebServ using SdFat and tried it with my full version. It serves files from the microSD correctly, but it's not a drop-in replacement and I have created some bugs. Of course if I switch servers I can just delete that version.
The Nano uses the ESP32-S3 in a NORA-W106 module. I don't know whether that makes a difference compared to your system. It has been very reliable in every other way, and I have been testing on more than one copy.
New this morning: another thing I did yesterday was follow some old online advice that says to use a downloadable formatting tool instead of the one in my OS. For what it's worth I haven't seen the reliability problem today.
Most of the code (but not the web parts) is from a version which runs on Arduino Megas and clones with the ATmega2560 chip. Dozens of devices have run for many thousands of hours and I have never heard of a data access issue. The microSD cards were presumably formatted on Mac, PC, or most often used straight from the retail package. Maybe the formatting is more critical at the higher speeds of the ESP32.