The problem you face is in regard to what does the file locking and cache-coherency.
Because you're using a NFS based solution the NFS server itself needs to manage which clients have locked any given file and, once changes are made, to ensure that it's own cache remains coherent (usually by flushing it's own cache of the file as it previously was).
If you created a per node caching layer on the client machines they'd have to work with the server to ensure their copy of cached files were synchronised with any writes to the files - and I don't believe there are any protocols available to accomplish this.
Obviously individual nodes could cache these files with some form of version identifier, probably the last-written date/time stamp and check this hasn't changed before any cache reads but this is typically an in-memory cache, you'd need to write something very specific to sync this if local disk was used.
You may well be on the right track with the distributed file-system approach as the locking, and thus cache-coherence is managed in a distributed fashion by the nodes themselves, not by a centralised server. A while there are many different distributed file-system out there I know that Ceph and a few others do allow for node-led caching of shared file-system objects/files.