This is probably due to the mappings in your web.xml file. A Vaadin application maps all URIs to be handled by the application servlet by default. This means that every request gets parsed by the application servlet, which for the /VAADIN/* case always just forwards the actual file to the client. This is why it works when you put your image in the theme directory.
So, in short, you need to specify the files / directories that you want your servlet container to just offer as a normal HTTP server in the web.xml file.