First, trim is not used for zeroing blocks. Trim is used to tell an SSD that a block is no longer needed and its contents can be discarded. The intent of trim is to actually help an SSD do write leveling by telling it that it can freely rewrite a block without first preserving its contents. As such, it doesn't necessarily make sense to take an extra step to zero the block first.
The SSD trim standard states that reading a trimmed block will produce undefined results, rather than a zero block, although some versions of the standard do include a "read zero after trim" version of trim. Since reading a trimmed block has undefined behavior, even ignoring cache issues, it is unlikely you will be able to tell if a block is trimmed by timing a read of it. Writing to a trimmed block might not have a timing difference either, as write leveling might cause a different physical block to be written anyway.
Since trim is intended to discard blocks, a filesystem would not use trim on a block in a file -- but only on a block freed from a file. So to ask if there is a way to tell if a block in a file has been trimmed makes no sense, because a filesystem would not do this to a file. If you do have a filesystem with trimmed blocks in files, the filesystem is likely corrupt. Even if you do have such a corrupt filesystem, the trim standard does not include any way to query if a block is trimmed, or even how many blocks on the SSD are trimmed. A better question would be to ask if there is a way to determine if a block in a file is corrupt. Some filesystems (e.g., zfs, others) do have this ability, but it may not be directly accessible outside of filesystem internals. In a RAID, on reading a corrupt block, the raid might log this event, but will also reconstruct the block and likely rewrite a good block in its place. If that fails, presuming the RAID doesn't just go offline, it might return an I/O error.
However if your filesystem is actually an image of a filesystem that is actually a file in another filesystem, fstrim can tell the operating system to release free blocks, which causes the underlying filesystem to actually create holes in the filesystem image file. Unlike trim on SSDs, the behavior of holes in files is very well defined, and will always return zeros. There are also (somewhat unportable) system calls that will allow a program to ask the filesystem where the holes in a file are.