change your code order like this
routes.MapPageRoute("", "Product/{productName}", "~/Product.aspx");
routes.MapPageRoute("", "{categoryName}/{subCategoryname}", "~/SubCategory.aspx");
routes.MapPageRoute("", "{categoryName}", "~/Category.aspx");
Order is very important. Because you enter url like "www.domain.com/abc/abc" and if
routes.MapPageRoute("", "{categoryName}/{subCategoryname}", "~/SubCategory.aspx");
at third no. then this route never called. it call following route.
routes.MapPageRoute("", "{categoryName}", "~/Category.aspx");
And value will be.
string Value= Page.RouteData.Values["categoryName"].ToString();
Value= "abc/abc";
So, Url Pattern that Contain one Parameter should be at the and Route Collection.