Bash executes only ~/.profile but neither of ~/.bash_profile and ~/.bashrc I have a strange problem with bash:

I switch my default shell to /bin/sh from zsh and it doesn't execute ~/.bash_profile or ~/.bashrc when I open a new terminal, it only executes ~/.profile.

What could be the problem?

I could probably source ~/.bashrc from ~/.profile but that does't seem like a good idea, e.g. it would break if I changed to another shell again.
I suggest that you read the bash manual under the heading INVOCATION which states:

   If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as  closely
   as  possible, while conforming to the POSIX standard as well.  When invoked as an interactive login shell, or a non-
   interactive shell with the --login option, it first attempts to read and  execute  commands  from  /etc/profile  and
   ~/.profile,  in that order.  The --noprofile option may be used to inhibit this behavior.  When invoked as an inter-
   active shell with the name sh, bash looks for the variable ENV, expands its value if it is  defined,  and  uses  the
   expanded  value as the name of a file to read and execute.  Since a shell invoked as sh does not attempt to read and
   execute commands from any other startup files, the --rcfile option has no effect.  A non-interactive  shell  invoked
   with the name sh does not attempt to read any other startup files.  When invoked as sh, bash enters posix mode after
   the startup files are read.


A new terminal session in OS X/macOS always starts as a login shell.