Is there a hook for nav menu item links to add custom css programatically?

Yes, there is, and the hook is nav_menu_link_attributes:

apply_filters( 'nav_menu_link_attributes', array $atts, WP_Post $item, stdClass $args, int $depth )

Filters the HTML attributes applied to a menu item’s anchor element.

For example, this adds the nav-link class to the <a> tag only if the theme location ($args->theme_location) is exactly my-location:

add_filter( 'nav_menu_link_attributes', 'my_nav_menu_link_attributes', 10, 3 );
function my_nav_menu_link_attributes( $atts, $item, $args ) {
    if ( 'my-location' === $args->theme_location ) {
        // Get existing classes, if any.
        $class = $atts['class'] ?? '';

        // Now add your custom class(es).
        $atts['class'] = "$class nav-link";
    }

    return $atts;
}