This idea is the essence of *Dantzig-Wolfe decomposition*, which is an exact algorithm for solving linear and mixed integer linear programming problems with such *block-angular* structure. The $\le 0$ constraints in your original problem are called *complicating* or *linking constraints*. If these constraints are removed, the resulting subsystem decomposes into $d$ disjoint subproblems. Instead of imposing a stronger version of the linking constraints in each subproblem (which can lose optimality, as you noted), Dantzig-Wolfe relaxes the linking constraints and uses *column generation* to find improving columns, as in the primal simplex method. A *master* problem uses the existing columns generated so far and finds optimal dual variables for the linking constraints. Each subproblem is then solved independently (and, optionally, in parallel) to minimize the reduced cost based on the dual values. The process repeats, iterating between master and subproblem until convergence. Upper and lower bounds are available at each stage, so you always have a measure of the current optimality gap. By the way, [this algorithm is implemented in SAS software][1] (disclaimer: I work for SAS). The user can just specify the block id for each constraint, and the solver takes care of the rest. In fact, several automatic block-detection methods are also provided. [1]: https://go.documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=v_010&docsetId=casmopt&docsetTarget=casmopt_decomp_overview.htm&locale=en