When dealing with $row in the foreach loop you aren't dealing with the same variable that is in the array, but a copy. If you want to make lasting changes you need to use a reference.
function addLength($toAdd, $added){
   $result = $toAdd;
    foreach ($result as & $row) {
        foreach ($added as $key => $value) {
            if($key == $row['id'] ){
                $row['length'] = $value;   
            }
        } 
    }
    var_dump($result);
    return $result;
}
Please make sure to note that a reference will still exist after the foreach loop has completed. It will contain a reference to the last element of your $result array. To stop this you would need to manually unset the reference.
    function addLength($toAdd, $added){
   $result = $toAdd;
    foreach ($result as & $row) {
        foreach ($added as $key => $value) {
            if($key == $row['id'] ){
                $row['length'] = $value;   
            }
        } 
    }
    var_dump($row); // Outputs the last element of your $result array
    unset($row);
    var_dump($row); // Now undefined.
    var_dump($result);
    return $result;
}
Just as an FYI, you can optimise your code and get rid of the second foreach loop, it's just not necessary. This would do the same:
function addLength($toAdd, $added){
   $result = $toAdd;
    foreach ($result as & $row) {
        if ( array_key_exists($row['id'], $added) ) {
            $row['length'] = $added[$row['id']];
        }
    }
    var_dump($result);
    return $result;
}
Now rather than looping through $added for every item in $toAdd you just check to see if the data is there (by checking for the array key) and if it is, use it.