This is happening because ng-include/ng-if creates a prototypically inherited child scope.
Let's begin with why $parent trick didn't work for you, basically addBillDetails variable wasn't allocated in immediate $parent scope of testCtrl. Since views/test.html template gets rendered based on ng-if & ng-include directive combination. It creates different scope hierarchy, refer below diagram.
//ng-controller="parentCtrl" `$scope.addBillDetails`
|
|
ng-if
   |
   |- ng-inlcude
      |
      |- ng-controller="testCtrl" ($scope.$parent.$parent.$parent.addBillDetails)
By looking at above diagram, if you want to modify addBillDetails of parent testCtrl, the you have to use $scope.$parent.$parent.$parent.addBillDetails in order to get hold of correct value. Check demo here. Never use $parent in your code, that makes your code tightly couple html design & assumption.
In such cases using object (reference type variable) are preferred or using controllerAs pattern while using controller ( controllerAs version).
Recommend to read on "What are the nuances of scope prototypal / prototypical inheritance in AngularJS?"
Html
{{model.addBillDetails}}
  <div data-ng-if="!model.addBillDetails">
    <button class="btn btn-small" data-ng-if="trItem.skuId==217" data-ng-click="addDetails()">Add Details</button>
  </div>
  <div data-ng-if="model.addBillDetails" data-ng-include="'views/test.html'"></div>
Code
.controller('parentCtrl', function($scope) {
    $scope.model = {};
    $scope.model.addBillDetails = true;
    $scope.addDetails = function() {
      $scope.model.addBillDetails = true;
    };
})
.controller('testCtrl', function($scope) {
    $scope.cancel = function() {
      alert("cancel");
      $scope.model.addBillDetails = false;
    };
})
Preview