You are using the wrong interface. Texture::read() and Shader::load() are low-level calls that do not search the model path. Instead, use TexturePool::load_texture() and ShaderPool::load_shader(). These higher-level objects also will automatically cache file references, so multiple loads to the same filename will return the same object.
Yes. Panda is case-sensitive, because some operating systems are case-sensitive (and p3d files are case-sensitive), so it’s necessary to write case-sensitive filenames in order to ensure your code remains portable.
For the record, if you have no intention of ever running your code on anything other than Windows, and no intention of ever packaging it in a p3d file, and you like being sloppy with filename case, you can put:
vfs-case-sensitive 0
in your Config.prc file to turn off the case sensitivity.