Simple text toggling
Instead of setting the active property to an element in the array, set it to the index of the element.

The reason for this being that almost all your operations are on the index and not the element itself. You only use that once: when you display the element. You can then eliminate your calls to indexOf because you already have the result. You can also simply the logic around first and last by centralizing it.

var app = angular.module('app', []);
app.controller('ctrl', ['$scope',
    function ($scope) {
        $scope.hello = 'hello world';
        $scope.boxes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
        $scope.active = 0;
        $scope.move = function (x) {
            if(x) {
               //while incrementing keep the index in bounds using min
               $scope.active = Math.min($scope.active+1,$scope.boxes.length - 1);
            } else {
               //while decrementing keep the index in bounds using max
               $scope.active = Math.max($scope.active-1,0);
            }
        };
        $scope.$watch('active', function (active) {
            //it's usually possible for the first element to be the last as well
            //so unless you know you'll never have an array with 1 element
            //don't use an if-else here
            $scope.first = active == 0;
            $scope.last = active == $scope.boxes.length - 1;
        });
    }
]);