serveNotFound :: Snap ()
serveNotFound = do
modifyResponse $ setResponseStatus 404 "Not Found"
really ought to result in an HTTP response status code of 404, but serveFile seems to force the response to 200. As you can see from the above use case, I'm not sure it should do that.
This would seem to be a bug against 'snap-server', but that project doesn't have an "Issues" tab so I filed it here. Sorry if that wasn't the right thing to do (it was just suggested that I should note that here).
It's not a bug against snap-server, this code lives in snap-core.
The "serveFile" function does a lot of checking for range requests and last-modified headers, etc, none of which you care about when you are trying to serve a 404 response. The function you are looking for is "sendFile".