Read data is (directly) read from the cache only if it is already there. That implies that cached data was previously accessed by a process and kept in cache. There is no system call or any method for a process to know if some piece of data to be read is already in cache or not.
On the other hand, a process can select if it wants written data to be immediately stored on the disk or only after a variable delay which is the general case. This is done by using the O_SYNC flag when opening the file.
There is also the O_DIRECT flag which when supported force all I/Os to bypass the read and write cache and go directly to the disk.
Finally, the hard-disk itself is free to implement its own cache so even after a synchronous write call has returned, there is no guarantee data is already on the disk platters.