Normally AMPL's presolve phase removes any "subject to" constraints that represent simple lower or upper bounds on variables. These bounds are passed to the solver as part of the variables' definitions; or in the special case where the lower bound equals the upper bound, the variable is fixed and also is removed from the problem. After the solver returns dual values for the reduced problem, AMPL recreates dual values for the constraints that presolve dropped. The dual values should be correct even if the bounds were equal and the variable was removed from the problem.
When AMPL's presolve is turned off (option presolve 0) then all of the "subject to" constraints are sent to the solver as given in their AMPL definitions (except in trivial cases such as where a constraint contains no variables). I would expect Gurobi to then return correct dual values for those constraints, which would be reported by AMPL.
In my experience, the most common cause of seemingly wrong dual values is that there are multiple optimal solutions to the dual problem, and the one that is returned (or recreated) does not provide the marginal values that are expected. However, we're willing to investigate cases where the dual solution appears to be suboptimal or infeasible for the dual problem.
Bob Fourer
4...@ampl.com