If you start the circular import with import mod.pkg, then mod/pkg.py starts first, and tries to import mod.sub_mod.sub_pkg. mod/sub_mod/sub_pkg.py starts, and tries to run from mod import pkg, but the mod.pkg module is already being initialized.
Python skips to trying to retrieve the pkg attribute from the mod module object. However, that attribute isn't set until the mod.pkg module finishes initializing, so from mod import pkg fails.
If you start the circular import with import mod.sub_mod.sub_pkg, then mod/sub_mod/sub_pkg.py starts first, and tries to run from mod import pkg. mod/pkg.py starts, and tries to import mod.sub_mod.sub_pkg. The mod.sub_mod.sub_pkg module is already initialized, but Python doesn't try to access attributes this time.
from mod import pkg needs to retrieve the pkg attribute from mod because it needs to bind the value of that attribute to the name pkg in the local namespace. However, import mod.sub_mod.sub_pkg only binds the mod name in the local namespace. Python binds the mod name to the mod module in mod.pkg's module namespace and continues on.
In Python 3, in the first case, there's a fallback when from mod import pkg fails to find the pkg attribute on mod. Python checks the sys.modules dict for an entry for 'mod.pkg', finds one, and binds the module it finds to the pkg name.